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

时间:2015-04-05 06:59:50

标签: javascript promise es6-promise

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

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

2 个答案:

答案 0 :(得分:3)

在执行所有同步代码之后,

承诺解析挂钩总是称为。这是设计 - 并且是为了防止竞争条件。

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

specified here

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

许多测试框架 - 即Mocha支持测试直接承诺 - 承诺语法 - 通过返回一个承诺。

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

答案 1 :(得分:-2)

你应该总是给"然后"一个功能。所以你应该使用" onFullfilled()"而不是" onFullfilled"作为"的参数"。

所以应该是这样的:

Promise.resolve(真)。然后(onFullfilled());