Promise定义时就执行的问题和疑惑

想用promise.all同时执行两个异步方法,可promise定义时(如let p1 = wake(3000);)就执行了,就像下面的情况。promise.all怎么同时执行两个动作?
// 控制台环境下输入,两段分开

let wake = (time) => {
  return new Promise((resolve, reject) => {
    console.log(time);
    setTimeout(() => {
      console.log('time::::',time)
      resolve(`${time / 1000}秒后醒来`)
    }, time)
  })
}

let p1 = wake(3000); // 打印:3000;间隔3s打印: 3秒后醒来
let p2 = wake(2000); // 打印:2000;间隔2s打印: 2秒后醒来
// 此处敲回车并等待,结果如图

image.png

// 然后再输入如下内容,回车
Promise.all([p1, p2]).then((result) => {
  console.log(result)       // 立即输出[ '3秒后醒来', '2秒后醒来' ],没有其他console
}).catch((error) => {
  console.log(error)
})

如图:image.png

后面的promise.all(),只有接受promise的作用?那这种promise是不是没有意义?

阅读 4.5k
5 个回答

首先 js 中不存在同时执行

因为你在 p1 = wake(3000) 处已经调用了方法, p1 中现在是个 Promise。
image.png

那么我们在你调用时,不执行,留在Promise.all时执行。

image.png

1.promise在你实例化时就开始了,看wake函数的第一个console.log(time)首先打印了

2.建议简单实现一下Promise.all的方法更好理解。Promise.all更像是一个等待的方法,它本身是返回一个Promise,它等待所有传入的Promise完成,或者是有一个失败,就改变status(====>onFulfilled 或者 ===>onRejected)。


var myPromiseAll = function(promises) {  
    var result = [];  
    var completedPromises = 0;  //计算已完成的Promise的数量
    return new Promise(function (resolve, reject) {  
        promises.forEach(function(p, index) {  
            //某个item不是Promise,也把它变成Promise
            Promise.resolve(p).then(function (value) {  
                result[index] = value; //保持原有的顺序,返回结果
                completedPromises += 1;  
                if(completedPromises === promises.length) {  
                    //所有都完成,resolve结果
                    resolve(result);  
                }  
            }).catch(function (error) {  
                //只要有一个失败,reject回去
                reject(error);  
            });  
        });  
    });  
}
Promise.all()将多个异步请求合并成一个Promise,按顺序返回值。
定义确实会执行。不想执行就不要定义直接Promise.all([wake(3000), wake(2000)])

我的理解是 Promise.all([p1, p2])是在“一段时间”内“并发执行”p1 p2,“一段时间”结束后,同时抓取p1 p2的resolve reject,这两个promise视为同时发出。不知道题主的“同时执行”如何定义?

代码描述有问题:

let wake = (time) => {
  return new Promise((resolve, reject) => {
    console.log(time);
    setTimeout(() => {
      console.log('time::::',time)
      resolve(`${time / 1000}秒后醒来`)
    }, time)
  })
}

p1、p2的注释出现了问题

let p1 = wake(3000); // 打印:3000;间隔3s打印: ‘time::::3000’
let p2 = wake(2000); // 打印:2000;间隔2s打印: ‘time::::2000’

走下边的代码,‘3秒后醒来’才打印。立即输出?那把时间设置长一些(一个10s,一个5s),看看是立即输出么?

Promise.all([p1, p2]).then((result) => {
  console.log(result)       // 立即输出[ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
  console.log(error)
})

没有其他console,还想要啥console?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题