如果在服务端异步去调用一个接口数据,使用Promise
方式
getSomeAsyncData()
.then(value1 => handle1(value1))
.then(value2 => handle2(value2))
.then(value3 => handle3(value1, value2, value3))
在上述最后的一次调用中value1
和value2
是undefined
,如果要使用value1
和value2
的值,需要将其设置为外部变量,这样做起来会导致代码不够优雅,那么就可以使用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
一个promise
、generator
、array
、object
,但不允许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));
如果觉得我的文章对您有用,请您随意打赏。您的支持将鼓励我更加努力创作!
如无特殊声明,文章均为原创,若有不正之处,万望告知。转载请附上原文地址,十分感谢!