美文网首页
js 异步编程方案

js 异步编程方案

作者: 猪蹄炖粥 | 来源:发表于2018-08-03 11:12 被阅读3次

    异步函数fun1、异步函数fun2

    需求如下:

    需求1、fun1执行成功后执行fun2

    需求2、同时执行fun1fun2fun1fun2都执行成功后打印"all success",否则打印出失败原因

    需求3、同时执行fun1fun2,无论fun1fun2执行成功或者失败都打印'finish'

    需求4、同时执行fun1fun2, 执行快的函数

    callback

    需求1
    会导致回调地狱。

    promise

    • 规范:ES6 standard

    • 链式调用

    • babel配置

    fun1(){
        return new Promise(resolve,reject){
            try{
              console.log("execute fun1")
              resolve('fun1');
            }catch(){
              reject('fun1 fail');
            }
        }
    }
    fun2(){
        return new Promise(resolve,reject){
            try{
              console.log("execute fun2")
              resolve('fun2');
            }catch(){
              reject('fun2 fail');
            }
        }
    }
    //需求1
    fun1().then(()={
        fun2();
    });
    //需求2
    Promise.all([fun1(),fun2()]).then(()=>{
        console.log('all success');
    }).catch((err)=>{
        console.log(err)
    });
    //需求3 不确定哦
    Promise.all([fun1(),fun2()]).finally(()=>{
        console.log('finish');
    })
    //需求3 
    Promise.race([fun1(),fun2()]).then((data)=>{
        console.log(`faster is ${data}`);
    })
    

    generator + co

    中序遍历代码

    function* traverseTree(node) {
        if (node == null) return;
        yield* traverseTree(node.left);
        yield node.value;
        yield* traverseTree(node.right);
    }
    
    • ES6
    fun1(){
        return new Promise(){
            
        }
    }
    
     co(function *(){
       // yield any promise
       var result = yield Promise.resolve(true);
     }).catch(onerror);
     
     co(function *(){
       // resolve multiple promises in parallel
       var a = Promise.resolve(1);
       var b = Promise.resolve(2);
       var c = Promise.resolve(3);
       var res = yield [a, b, c];
       console.log(res);
       // => [1, 2, 3]
     }).catch(onerror);
     
     // errors can be try/catched
     co(function *(){
       try {
         yield Promise.reject(new Error('boom'));
       } catch (err) {
         console.error(err.message); // "boom"
      }
     }).catch(onerror);
    

    async + await

    在babel中别编译为generator

    参考

    相关文章

      网友评论

          本文标题:js 异步编程方案

          本文链接:https://www.haomeiwen.com/subject/isryvftx.html