2017-04-23 90 views
0

承诺解决后,我们可以使用.then方法,它什么时候运行?它解决后立即运行吗?例如,在下面的例子中,一旦Javascript出现,promise就会“准备就绪”,仪式?没有什么大事。由于承诺中没有大的计算,为什么.then方法在其他所有方面都运行?由于Javascript - 一旦解决了承诺的结果,何时可用?

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

'。那么()'不保证返回结果同步 – guest271314

+0

我应该假设{}。那么一切都将运行后其他?谢谢 –

+1

尽量不要“承担”任何事情,在这里。如果你想使用'Promise'链,链'.then()'和'.catch()'并且在传递给'.then()'和'.catch()'的函数中执行任务。如果你想使用同步代码,使用同步代码。你为什么试图同步异步代码的同步代码?你想达到什么目的? – guest271314

回答

2

按照Promises/A+ spec

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

注3.1状态

这里“平台代码”是指发动机,环境和承诺的实现代码。在实践中,这一要求确保onFulfilled和onRejected执行异步,在事件发生后循环依次然后叫,并用新的堆栈....

所以,从某种意义上说你的评论说。然后将运行 “一切之后” 是一个好的假设

考虑下面的代码

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

我可以肯定的是,控制台输出将是

  • B 2
  • ...
  • J,10卷

需要明确的是,如果这些之一.then函数内部有异步代码(返回一个Promise),该序列将而不是被简单地预测 - 我只是在展示你R“假设” - 那.then一切后,将运行 - 实际上是相当合理的一个