2015-04-05 38 views
1

我注意到Firefox的承诺推迟了完整性通知。断言失败后,因为onFullfilled()被调用得太晚*何时调用Promise.then()钩子?

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

当恰好onFullfilled()保证在承诺的分辨率被称为?

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

回答

3

无极分辨率钩总是称为执行所有同步代码。这是设计 - 为了防止竞争条件。

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

这是specified here

onFulfilled或onRejected不能调用,直到执行上下文栈只包含平台的代码。

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

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

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

所以它应该是这样的:

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

+0

不,“.then(onFulfilled)'是正确的。 'onFulfilled'是一个函数。 'onFulfilled()'是一个函数调用。 – 2015-08-20 06:39:43