Discuss / JavaScript / 廖老师,求问下下面这个问题:

廖老师,求问下下面这个问题:

Topic source

beijing_lmx

#1 Created at ... [Delete] [Delete and Lock User]
在此插入代码

var p1 = new Promise(function (resolve, reject) { log('start new Promise...'); resolve('200 ok');

});

log('hello1!');

var p2 = p1.then(function (r) { log('Done: ' + r); });

log('hello2!');

p2.catch(function (reason) { log('Failed: ' + reason); });

log('hello3!');

为啥上面的输出顺序是:

在此插入代码

Log:

start new Promise...

hello1!

hello2!

hello3!

Done: 200 ok

promise内的函数调用不太明白其具体的执行时机。

正因为是异步的,所以你确定不了什么时候返回

new Promise(function (resolve, reject) {
    log('start new Promise...');
    resolve('200 ok');

});

这个部分是顺序执行的 先执行内部函数 然后再创建Promise对象

问题是这里为什么Done: 200 ok会在hello2!和hello3!的后面呢?

The executor is expected to initiate some asynchronous work and then, once that completes, call either the resolve or reject function to resolve the promise's final value or else reject it if an error occurred. 这里说的executor启动一个异步工作,是指当前顺序执行的代码和Promise中的resolve,reject之间是异步吗? 他说等这个异步工作结束后,再调用resolve或者reject。那么如果我的当前代码段很长很长,Promise也会等到这些代码全部执行完后才调用resolve或者reject吗?

古人云:“君子一诺千金”,这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。 我想知道的是,这里承诺将来会执行,这里的将来有什么限制吗?

var p1 = new Promise(function (resolve, reject) {
    console.log('start new Promise...');
    resolve('200 ok');

});

console.log('hello1!');

var p2 = p1.then(function (r) {
    console.log('Done: ' + r);
});

console.log('hello2!');

p2.catch(function (reason) {
    console.log('Failed: ' + reason);
});
for(let i = 0; i < 1000000000; i++)
{}
console.log('hello3!');

VM1300:2 start new Promise...
VM1300:7 hello1!
VM1300:13 hello2!
VM1300:20 hello3!
VM1300:10 Done: 200 ok

这里的结果感觉可以支持我上面的猜想

看一下这篇blog,也许你能理解背后相关的机制,js的执行本质就是单线程的,虽然宿主环境不是。Promise也只是定义了一个异步调用的规范而已,只有在执行线程空闲的情况下,才会去执行异步任务队列中的任务(其中事件会优先执行)

resolve, reject 这些函数的执行也是放到异步任务队列里面的。

JavaScript的单线程机制

new Promise()内部的函数会被立刻执行,所以有输出结果的第一行。然后,then()内部的函数都是异步任务,异步任务会被放在异步任务队列里,等所有同步任务,也就是楼主代码里的log(...),执行完毕后,再执行异步任务队列里的任务,所以输出结果就是楼主给的这样了。


  • 1

Reply