承诺解决后我们可以使用.then方法,它什么时候运行?它是否在解决后立即运行?例如,在下面的示例中,只要Javascript出现,承诺就会“准备就绪”,rite?没有什么大事发生。由于承诺中没有大的计算,为什么.then方法会在其他所有方法之后运行?感谢
let $body = $('#mainBlock');
let checker = true;
let testPromise = new Promise(
function(resolve, reject)
{
if(checker)
{
resolve();
$body.append('<p>CodeHasFinished</p>');
}
}
);
$body.append('<p>before</p>');
testPromise.then(function(){
$body.append('<p>middle</p>');
});
$body.append('<p>after</p>');
/*
Result added to body->
CodeHasFinished
before
after
middle
*/
答案 0 :(得分:2)
2.2.4。在执行上下文堆栈仅包含平台代码之前,不得调用onFulfilled或onRejected。 [3.1]
注3.1状态
此处“平台代码”表示引擎,环境和承诺实现代码。实际上,这个要求确保onFulfilled和onRejected异步执行,然后调用事件循环,并使用新堆栈....
所以,从某种意义上说,你的评论.then将在“其他一切之后”运行是一个很好的假设
考虑以下代码
let i = 0;
console.log('a', ++i);
Promise.resolve().then(() => console.log('e', ++i)).then(() => console.log('h', ++i)).then(() => console.log('j', ++i));
console.log('b', ++i);
Promise.resolve().then(() => console.log('f', ++i)).then(() => console.log('i', ++i));
console.log('c', ++i);
Promise.resolve().then(() => console.log('g', ++i));
console.log('d', ++i);
我可以确定控制台输出将是
要明确的是,如果其中一个.then
函数中有一个异步代码(返回一个Promise),序列不就像预测一样简单 - 我只是证明你的“假设” - {{1>} .then
将在其他一切之后运行 - 实际上是非常合理的