javascript - 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);
});
解决方案
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' };
}
推荐阅读
- javascript - JQM 日历显示多个月份
- java - 我如何只注入一个地图
- c++-winrt - C++/winRT xaml 键盘事件处理程序
- linq - 即使表不返回匹配项,Linq 从多个连接中选择并返回所有行
- javascript - 发出 AJAX 请求的问题
- android - firebase“.MyFirebaseInstanceIDService”和“.java.MyFirebaseMessagingService”的未解析类
- typescript - T 扩展抽象类构造函数
- python - 从 scipy.linalg.eig() 得到不同的答案
- android - 运行时 [动态] 更新 Android 的 Gmap 键
- akka - Akka DeadLetter 监视器未收到 unhandled() 发送的消息