JavaScript 并行调用多个异步调用

标签 javascript async-await

我有一个名为imagesToUpload的数组。上传函数返回一个 promise 。现在我必须等待,图片陆续上传。这是我的示例代码。

function uploadTos3Bucket(filename){
    return new Promise((resolve,reject)=>{
        resolve(filename+'.png')
    })
}

const imagesToUpload = ['Homer','Bart','Lisa','Millhouse'];

async function controller() {
    const links = []

    for (const imageFile of imagesToUpload) {
        const link = await uploadTos3Bucket(imageFile);
        links.push(link)
    }
    console.log('links',links)
    
}
controller();

而不是这个,我想要一些传递图像数组的东西。图像并行上传。全部完成后,我得到了链接数组。当然我知道 Promise.all()

的概念

这不是我想要的。

const [image1,image2] = await Promise.all([uploadTos3Bucket('Homer'),uploadTos3Bucket('Bart')])

我不想分配这么多变量。我只想要一个包含所有链接的数组,最重要的是,如果某些图像上传失败,它应该忽略而不是破坏整个过程。

最佳答案

imagesToUpload 数组中,使用 .map 将其转换为 Promises 数组,然后对该数组调用 Promise.allSettled,通过检查每个结果对象的 status 属性,最后检查 .map 到它们的解析值,仅过滤已履行的 promise :

function uploadTos3Bucket(filename){
    return new Promise((resolve,reject)=>{
        resolve(filename+'.png')
    })
}

const imagesToUpload = ['Homer','Bart','Lisa','Millhouse'];

async function controller() {
  const results = await Promise.allSettled(imagesToUpload.map(uploadTos3Bucket));
  const links = results
    .filter(({ status }) => status === 'fulfilled')
    .map(({ value }) => value);
  console.log('links',links)  
}
controller();

对于尚无法识别 Promise.allSettled 的浏览器,请添加 polyfill ,或使用 here 列出的众多方法之一实现该功能。

关于JavaScript 并行调用多个异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59821580/

相关文章:

c# - 为什么 HTTP 请求永远不会返回异步等待?

javascript - 如何将 CKEditor 内容包装在一个 div 中?

javascript - Month Path 只计算月份,不计算实际日期范围

javascript - Visual Studio 无法识别 ES6 模板字符串

c# - .NET 4.5 中不完整的异步任务有何影响?

asp.net - 异步/等待、TPL、WCF 服务、Web API : So many choices

c# - 调用异步函数的不同方式

javascript - 如何在不更改 $location.search 中的参数值的情况下触发 routeUpdate

javascript - 如何在动态生成的元素上实现手动单击事件

c# - 使用 async/await,continuation 什么时候发生?