2

我观察到 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()?

* 在我的情况下,测试框架报告断言失败后出现“已完成”日志消息。

4

2 回答 2

3

在执行所有同步代码后,始终调用承诺解决挂钩。这是设计使然 - 并且是为了防止竞争条件。

由于 Promise 有时会异步解析,因此规范要求它们总是异步解析,因此执行相同的代码路径。Promise保护您免受 Zalgo的侵害。

此处指定:

在执行上下文堆栈仅包含平台代码之前,不得调用 onFulfilled 或 onRejected。

许多测试框架 - 即 Mocha 支持直接使用 promise-syntax 测试承诺 - 通过返回一个承诺。

it("does something", function(){
    return aPromise; // if aPromise resolves the test passes
})
于 2015-04-05T07:02:39.883 回答
-2

你应该总是给“then”一个函数。所以你应该使用“onFullfilled()”而不是“onFullfilled”作为“then”的参数。

所以它应该是这样的:

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

于 2015-08-20T04:12:19.607 回答