首页 > 解决方案 > Promises.all 在单个 Promise 上返回对象而不是数组 - 不能在不检查数组的情况下对返回的数据使用 forEach

问题描述

如何在同一个 Promise.all() 代码中处理单个和多个 Promise?upload() 是一个异步函数

例如

let promises = [];
promises.push( upload('file1.txt','file1.txt') );
promises.push( upload('file2.txt','file2.txt') );

Promise.all(promises).then( data => {
  // this forEach is fine as 'data' is an array 
  data.forEach( function(f) { 
    console.log("Uploaded:", f.name); }
  );
}).catch(error => { 
  console.error(error.message);
});

但是如果我尝试只承诺一个文件,那么 forEach 将会失败。

let promises = [];
promises.push( upload('file1.txt','file1.txt') );

Promise.all(promises).then( data => {
  // this forEach FAILS as data is an object
  data.forEach( function(f) { 
    console.log("Uploaded:", f.name); }
  );
}).catch(error => { 
  console.error(error.message);
});

标签: javascriptasynchronouspromiseasync-await

解决方案


Promise.all即使只提供一个承诺作为输入,返回的承诺总是解析为一个数组,所以我猜你的代码失败的原因在于返回data结构的性质。

let promises = [];
promises.push( upload('file1.txt','file1.txt') );

Promise.all(promises).then( data => {
  data.forEach( function(f) { 
    console.log("Uploaded:", f.name); }
  );
}).catch(error => { 
  console.error(error.message);
});

async function upload(fileName) {
   return { name: 'filename.example' };
}


推荐阅读