gpt4 book ai didi

javascript - Bluebird 中的嵌套 promise

转载 作者:数据小太阳 更新时间:2023-10-29 04:42:26 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何在 bluebird 库中正确使用 promises。我在我的代码中遇到了一些嵌套的 promise ,我注意到在 bluebird 文档中它是这样写的:

if you are utilizing the full bluebird API offering, you will almost never need to resort to nesting promises in the first place.

还有许多其他关于 promises 被滥用的博客文章,嵌套是一种常见的反模式。

loadCar(someUri) // jqXHR
.then(function (car) {
if (carHasFourDoors(car)) {
loadMake(car.make)
.then(function (make) {
loadModel(make.model)
.then(function (model) {
loadCarDetails(model)
});
});
}
else if (carHasTwoDoors(car)) {
loadModel(make.model)
.then(function (model) {
loadCarDetails(model)
});
}
});

我的所有函数都返回对象。查看 bluebird 文档,似乎有多个辅助方法:all()、join()、props()。

所以,我的问题是:如果存在依赖关系,如何避免嵌套?这可能是我对 promises 的异步性质的误解。这样的东西能行得通吗?

Promise.all(loadCar(someUri), loadMake(car.make), loadModel(make.model))
.then(function(car, make, model) {
// do logic
});

最佳答案

您总是需要嵌套控制结构,通常您需要为传递给 then() 的函数表达式嵌套一层。这不是完全可以避免的,但可以是 reduced significantly .

在您的情况下,您甚至可以省略一些函数表达式并直接传递函数。

loadCar(someUri).then(function (car) {
if (carHasFourDoors(car)) {
return loadMake(car.make)
else if (carHasTwoDoors(car))
return make; // not sure actually where you get this from
}).then(function (make) {
return loadModel(make.model)
}).then(loadCarDetails)

关于javascript - Bluebird 中的嵌套 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24412710/

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