gpt4 book ai didi

javascript - 在 .then() 链中传递 Promise.join 处理程序的结果

转载 作者:行者123 更新时间:2023-11-29 15:32:49 25 4
gpt4 key购买 nike

这与 How do I access previous promise results in a .then() chain? 相似但不完全相同

我有这样一种情况,我并行发出两个异步请求,然后是第三个异步请求,这取决于前两个请求的成功,最后将第二个异步请求的结果传递给函数回调。

截至目前,我了解如何通过两种方式执行此操作(为简洁起见省略了 .catch 语句和函数签名):

  1. 使用范围闭包(我当前的实现)

    var foo;
    Promise.join(promiseA, promiseB, function(resultsA, resultsB) {
    foo = resultsB;
    return promiseC;
    })
    .then(function() {
    // foo is accessible here
    callback(null, foo);
    });
  2. 使用 Promise.bind,但必须使用 Promise.map 而不是 Promise.join

    var targetIndex = 1;
    Promise.resolve(promises)
    .bind({})
    .map(function(response, index) {
    if (index === targetIndex) {
    this.foo = response;
    }
    })
    .then(function() {
    return promiseC;
    })
    .then(function() {
    // this.foo is accessible here
    callback(null, this.foo);
    });

如您所知,选项 2 相当难看,因为我必须手动检查映射器的索引参数是否与我关心的 promise 结果的索引匹配。选项 1 使用范围闭包,据我所知,在大多数情况下这是不可取的(但目前看来是我的最佳选择)。

我真正想做的是:

Promise.bind({})
.join(promiseA, promiseB, function(resultsA, resultsB) {
this.foo = resultsB;
return promiseC;
})
.then(function() {
// I WISH this.foo WAS ACCESSIBLE HERE!
callback(null, this.foo);
});

在这种情况下,我可以使用 Promise.join 而不是 Promise.map 来避免使用作用域闭包吗?

最佳答案

您有一个有趣的用例,因为 Promise 需要返回链中多个步骤的 promise 结果。对于这样一个“落后”的问题,我会推荐一个“落后”的解决方案;在 promiseC 之后将 resultB 添加回链中:

Promise.join(promiseA, promiseB, function(resultA, resultB) {
return promiseC.then(function() {
return resultB;
});
})
.then(function(resultB) {
callback(null, resultB);
});

理想情况下,promiseC 的结果应该是 resultB,但现在这始终是可能的。

编辑:请注意,我没有在这里故意使用嵌套 promise 。匿名函数只用于传递值,不执行逻辑。这种方法做同样的事情:

...
return promiseC.then(function() {
callback(null, resultB); // really not what you should be doing
});

但不鼓励,因为它添加了一层嵌套逻辑,破坏了链接的设计原则。

编辑 2:这可以使用绑定(bind)闭包来实现,例如:

Promise.join(promiseA, promiseB).bind({})
.then(function(resultA, resultB) {
this.resultB = resultB;
return promiseC;
})
.then(function(resultC) {
callback(null, this.resultB);
});

关于javascript - 在 .then() 链中传递 Promise.join 处理程序的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32874308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com