微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Javascript-在JS中的Promise之间传递中间数据,而无需使用Promise.all和Promise.resolve

这个问题已经在这里有了答案:            >            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()的数组中的非承诺值将已经自动包装在其中.

使用async / await

假设您的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] 举报,一经查实,本站将立刻删除。

相关推荐