Generator+Promise改善异步调用

该文章由 leevare 发布于 ,归类于 Javascript

如果在服务端异步去调用一个接口数据,使用Promise方式

getSomeAsyncData()
    .then(value1 => handle1(value1))
    .then(value2 => handle2(value2))
    .then(value3 => handle3(value1, value2, value3))

在上述最后的一次调用中value1value2undefined,如果要使用value1value2的值,需要将其设置为外部变量,这样做起来会导致代码不够优雅,那么就可以使用Generator + Promise的方式对代码进行改进。

const co = require('co');
function* handle() {
    const value1 = yield getsomeAsyncData();
    const value2 = yield handle1(value1);
    const value3 = yield handle2(value2);
    return yield handle3(value1, value2, value3);
}
co(handle());

co是Generator的执行器,npm介绍https://www.npmjs.com/package/co

需要注意的是co允许yield一个promisegeneratorarrayobject,但不允许yield一个普通函数。

在异步递归调用中,generator能发挥更大的用处,例如搜索一个二叉树中特定的值的节点,但是这个二叉树的数据是异步获取的。

function* searchBinaryTree(node, value) {
    const nowValue = yield node.value();
    if (nowValue === value) {
        return node;
    } else if (nowValue < value) {
        const rightNode = yield node.getRightNode();
        return searchBinaryTree(rightNode, value);
    } else if (nowValue > value) {
        const leftNode = yield node.getLeftNode();
        return searchBinaryTree(leftNode, value);
    }
}

co(searchBinaryTree(rootNode, 100));

如果觉得我的文章对您有用,请您随意打赏。您的支持将鼓励我更加努力创作!

相关文章:

说点什么

avatar
300
  Subscribe  
提醒