gpt4 book ai didi

javascript - 嵌套的 Promise 执行不同步

转载 作者:行者123 更新时间:2023-11-30 08:39:27 27 4
gpt4 key购买 nike

我有一个简单的设置,如图所示 this fiddle :

var doDelay = function(who) {
return Promise.delay(50)
.tap(function() {
console.log(who + ' done');
});
};

Promise.resolve()
.then(doDelay('a'))
.tap(function() {
console.log('a done2');
})
.then(doDelay('b'))
.tap(function() {
console.log('b done2');
})
.then(function() {
console.log('all done!');
});

输出是:

a done2
b done2
all done!
a done
b done

但我希望:

a done
b done
a done2
b done2
all done!

我做错了什么?

最佳答案

正如 Bergi 指出的那样,将 promise 作为参数传递给 then 是无效的,但即使它被允许,另一个问题是一旦您调用 delayMany(' a'),其中的 Promise.delay(50) 将开始执行,这不是您想要执行的操作。

您可以将调用包装在匿名函数中,或者使用 .bind():

var delayMany = function(who) {
return Promise.delay(50)
.tap(function() {
console.log(who + ' done');
});
};

Promise.resolve()
.then(delayMany.bind(null, 'a'))
.tap(function() { console.log('a done2'); })

.then(delayMany.bind(null, 'b'))
.tap(function() { console.log('b done2'); })

.then(function() {
console.log('all done!');
});

问:“为什么 then 在我向它传递 promise 时不抛出错误?”

这个问题的答案在 Promises/A+ spec 中:

A promise’s then method accepts two arguments:

promise.then(onFulfilled, onRejected)

2.2.1. Both onFulfilled and onRejected are optional arguments:

2.2.1.1. If onFulfilled is not a function, it must be ignored.

关于javascript - 嵌套的 Promise 执行不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27985332/

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