Generator+Promise改善异步调用
如果在服务端异步去调用一个接口数据,使用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));
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=1070