美文网首页
Generator + Promise改善异步流程

Generator + Promise改善异步流程

作者: 不困于情 | 来源:发表于2019-02-21 14:39 被阅读0次

    有时我们遇到这样的情况:

    getSomethingAsync()
        .then( a => method1(a) )
        .then( b => method2(b) )
        .then( c => method3(a,b,c) ) //a和b在这里是undefined!!!
    
    

    只用 Promise 的话,解决方法只有把 a、b 一层层 return 下去,或者声明外部变量,把a、b放到 Promise 链的外部。但无论如何,代码都会变得很难看。

    用 Generator 可以大大改善这种情况(这里使用了Generator的执行器co):

    import co from 'co';
    
    function* foo(){
        var a = yield getSomethingAsync();
        var b = yield method1(a);
        var c = yield method2(b);
        var result = yield method3(a,b,c);
        console.log(result);
    }
    
    co(foo());
    

    当然,Generate 的用处远不止如此,在异步递归中它能发挥更大的用处。比如我们现在需要搜索一颗二叉树中value为100的节点,而这颗二叉树的取值方法是异步的(比如它在某个数据库中)

    import co from 'co';
    
    function* searchBinaryTree(node, value){
        var nowValue = yield node.value();
        if(nowValue == value){
            return node;
        }else if(nowValue < value){
            var rightNode = yield node.getRightNode()
            return searchBinaryTree(rightNode, value);
        }else if(nowValue > value){
            var leftNode = yield node.getLeftNode()
            return searchBinaryTree(leftNode, value);
        }
    }
    
    co(searchBinaryTree(rootNode, 100))
    

    相关文章

      网友评论

          本文标题:Generator + Promise改善异步流程

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