Javascript - 一旦解决了承诺的结果,它什么时候可用?

时间:2017-04-23 00:37:00

标签: javascript promise

承诺解决后我们可以使用.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

*/

1 个答案:

答案 0 :(得分:2)

根据Promises/A+ spec

  

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);

我可以确定控制台输出将是

  • a 1
  • b 2
  • ...
  • j 10

要明确的是,如果其中一个.then函数中有一个异步代码(返回一个Promise),序列就像预测一样简单 - 我只是证明你的“假设” - {{1>} .then将在其他一切之后运行 - 实际上是非常合理的