这个问题已经在这里有了答案: > How do I access previous promise results in a .then() chain? 15个
我有点像JS菜鸟,但是到目前为止,我真的很喜欢ES6 / React / Immutable功能来进行函数编程和FRP,尤其是promise api.我特别喜欢链接.then的模式,例如somePromiseGenerator().then(…).then(…).catch(…).当异步调用的流程完全线性时,这是完美的.但是,通常我想将结果从该链的顶部传递到末尾.
我一直在使用的次优模式如下所示:
somePromiseGenrator()
.then(r => {
const inter = makeSomeIntermediateResults(r);
const newPromise = makeNewPromise(r);
return Promise.all([newPromise, Promise.resolve(inter)]);
})
.then(r => {
handleR0andR1(r[0], r[1]);
})
例如,当我从ElasticSearch获取数据并想用sql或Neo4J中的内容补充数据或调出辅助API时,就会发生这种情况.
使用Promise.all尤其是Promise.resolve似乎很浪费精力.有没有更好的方法来完成这项工作?
解决方法:
使用array destructuring命名变量:
somePromiseGenrator()
.then(r => {
const inter = makeSomeIntermediateResults(r);
const newPromise = makeNewPromise(r);
return Promise.all([newPromise, inter]);
})
.then([newPromiseResult, intermediateResult]) => {
handleR0andR1(newPromiseResult, intermediateResult);
})
仅此一个就更容易理解了,我还删除了冗余的Promise.resolve()
,因为传递给Promise.all()
的数组中的非承诺值将已经自动包装在其中.
假设您的Node.js版本为>= 7.6
(或者您使用的是支持ES2016功能的transpiler/bundler/polyfill),则可以转换以下内容:
function promiseChain() {
return somePromiseGenrator()
.then(r => {
const inter = makeSomeIntermediateResults(r);
const newPromise = makeNewPromise(r);
return Promise.all([newPromise, inter]);
})
.then([newPromiseResult, intermediateResult]) => {
return handleR0andR1(newPromiseResult, intermediateResult);
})
}
到这个:
async function promiseChain() {
const r = await somePromiseGenerator();
// I'm assuming this isn't a promise
// since it was initially wrapped in Promise.resolve()
const inter = makeSomeIntermediateResults(r);
const newPromiseResult = await makeNewPromise(r);
return handleR0andR1(newPromiseResult, inter);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。