首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript promise.all()

Javascript promise.all()
EN

Stack Overflow用户
提问于 2019-10-10 11:20:39
回答 4查看 107关注 0票数 0

我有这段代码。

代码语言:javascript
复制
function a() {
  var promise1 = Promise.resolve(3);
  var promise2 = 42;
  var promise3 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 2000, 'foo');
  });

  Promise.all([promise1, promise2, promise3]).then(function(values) {
    console.log("done", values);
  });
}

async function b() {
 await a(); 
}

b();
console.log("here")

在这里,我们得到输出

“这里”

两秒钟后,我们得到

“完成”数组3,42,"foo“

如何更改这段代码,以便在函数b()中,我们实际上是在等待a()完成,然后继续执行代码?

因此,我想要的输出是

等两秒钟看

“完成”数组3,42,"foo“

“这里”

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-10 11:29:01

您可以这样编写上面的代码:

代码语言:javascript
复制
function a() {
    var promise1 = Promise.resolve(3);
    var promise2 = 42;
    var promise3 = new Promise(function (resolve, reject) {
        setTimeout(resolve, 2000, 'foo');
    });

    // Promise.all([promise1, promise2, promise3]).then(function (values) {
    //     console.log("done", values);
    // });

    return Promise.all([promise1, promise2, promise3]);
}

async function b() {
    let values = await a();
    console.log('done', values);
    // return values; // This will get automatically get wrapped into a promise.
    return Promise.resolve(values);
}

b().then(() => { console.log("here") });

在这里,a返回一个承诺,在此之后,b还返回一个立即解决的承诺。

票数 1
EN

Stack Overflow用户

发布于 2019-10-10 11:30:33

你可以用一种以上的方式来做。

表格1

首先,正如@chris培根所述,由于a没有返回,所以您可以返回它,而不是处理承诺本身。

而不是

代码语言:javascript
复制
Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log("done", values);
});

使用

代码语言:javascript
复制
return Promise.all([promise1, promise2, promise3]);

表格2

另一种方法是使a函数成为一个async function,然后等待Promise.all,这样:

代码语言:javascript
复制
async function a() {
  ...

  await Promise.all([promise1, promise2, promise3]);
}

在第二种形式中,与第一种形式不同的是,您仍然可以在它返回后处理承诺:

代码语言:javascript
复制
async function a() {
  ...

  var values = await Promise.all([promise1, promise2, promise3]);
  console.log("done", values);
}

结论

这两个表单都响应您的请求,以更改您的代码段,它将几乎等同于您的代码。但是请注意,如果您使用的是catch函数,则必须在await周围使用一个try-catch。

票数 1
EN

Stack Overflow用户

发布于 2019-10-10 11:31:05

b是异步函数。因此,您可以在调用它时将等待放在前面,然后执行rest或执行类似的.then

代码语言:javascript
复制
b().then(res => {
 //rest codes  
 console.log("here")
})

顺便说一句,这并不需要在promise2面前放置等待,因为这甚至不是一个承诺对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58321708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档