什么时候调用 Promise.then() 钩子?

When Promise.then() hooks are called?

我观察到 Firefox 的承诺推迟了完整性通知。以下断言失败,因为调用 onFullfilled() 太晚了*.

var resolved = false;
function onFullfilled() {
    resolved = true;
    log("Completed");
}
Promise.resolve(true).then(onFullfilled);
assert(resolved, "Promise completed promise should call resolution hook immediately.");

何时保证在 Promise 解析时调用 onFullfilled()?

* 在我的例子中 "Completed" 在测试框架报告断言失败后出现日志消息。

Promise 解析挂钩总是 所有同步代码执行后调用。这是设计使然 - 这样做是为了防止竞争条件。

由于 promises 有时会异步解析规范要求,因此它们 总是 异步解析,因此执行相同的代码路径。承诺守护你against Zalgo.

specified here:

onFulfilled or onRejected must not be called until the execution context stack contains only platform code.

许多测试框架 - 即 Mocha 支持直接使用 promise 语法测试 promise - 通过返回 promise。

it("does something", function(){
    return aPromise; // if aPromise resolves the test passes
})

你应该总是给"then"一个函数。所以你应该使用 "onFullfilled()" 而不是 "onFullfilled" 作为 "then".

的参数

所以它应该是这样的:

Promise.resolve(true).then(onFullfilled());