异步的理解

setTimeout(function() {
  console.log(1)
}, 0);
new Promise(function executor(resolve) {
  console.log(2);
  for( var i=0 ; i<10000 ; i++ ) {
    i == 9999 && resolve();
  }
  console.log(3);
})
.then(function() {
  console.log(4);
});
console.log(5);

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
 ps:(setTimeout 与ajax异步的返回结果 都是要放到任务队列中,然后执行。所以即使setTime(fn,0),然并卵,仍然要等主线程的任务执行完)(settimeout的fn相当于ajax的successFn)

记住,异步promise的函数是当代码执行到时立即执行的,(异步是指异步于js主要线程,不代表不立即执行),执行的结果放到任务队列task queue中。

posted @ 2017-03-04 17:01  a fine day  阅读(200)  评论(0编辑  收藏  举报