javascript - Javascript Promise.all 没有运行
问题描述
我有一系列的承诺。
我从来没有打印出控制台日志“已处理的文件夹”。一旦第一次await Promise.all
调用,执行似乎就停止了。
不完全确定我错过了哪里?
const subfolders = [];
const exportFolder = () => {
// Other stuff happening here
const subfolder = {};
subfolder.items = [];
subfolder.items.push({ name: 'item 2.1' });
const folder = {};
folder.items = [];
folder.items.push({ name: 'item 1' });
folder.items.push({ name: 'item 2', isFolder: true, items: subfolder.items });
console.log('Folder:', folder);
console.log('Started');
exportFolderToCsv(folder).then(response => console.log('Finished', response));
};
const exportFolderToCsv = async folder => {
console.log('Processing folders');
let promises = [];
for (const folderItem of folder.items) {
if (folderItem.isFolder && folderItem.items.length > 0) {
subfolders.push(folderItem);
return;
}
promises.push(processFolderItem(folderItem));
}
await Promise.all(promises).then(response => console.log('Processed folders:', response));
if (subfolders.length > 0) {
console.log('Processing subfolders');
promises = [];
for (const folderItem of subfolders.items) {
promises.push(processFolderItem(folderItem));
}
await Promise.all(promises).then(response => console.log('Processed subfolders:', response));
}
console.log('Finished');
};
const processFolderItem = folderItem => new Promise(resolve => {
console.log('Processing folder item');
// To stuff here with folderItem, get Doc Chars, process row and resolve
getCharacters(folderItem)
.then(response => {
console.log('Processed folder item characters list:', response);
createCSVRow(folderItem, response)
.then(response => {
console.log('Processed CSV row:', response);
resolve(response);
})
});
});
const getCharacters = folderItem => new Promise(resolve => {
console.log('Processing folder item characters list');
// To stuff here with folderItem and then resolve
const characters = 'Foobar characters';
resolve(characters);
});
const createCSVRow = (folderItem, characters) => new Promise(resolve => {
console.log('Processing CSV row');
// To stuff here with folderItem and characters and then resolve
const csvRow = 'Foobar row';
resolve(csvRow);
});
exportFolder();
解决方案
Promise.all
如果链中的至少一个 Promise 抛出错误或拒绝它,该方法将捕获错误。
看来你的一个承诺有一个例外。
您可以简单地添加以下内容来调试它catch
:
Promise.all(PromiseList).then(()=>console.log("all works done") ).catch(errors=>console.log("something wrong",errors))
推荐阅读
- plsql - 我想使用 out 参数,但我没有得到正确的语法,:ORA-00900: invalid SQL statement
- php - 支持使用 PHP 生成 PDF 的所有语言
- sqlite - 如何用 SQLite 中另一列的累计总数更新一列?
- command-line - 为 JTS 运行升级命令时显示“升级必须以管理员权限运行”消息
- asp.net - 如何拆分和更改水晶报表元素的字体样式?
- java - 带有部署我的战争的 jboss/wildfly docker 映像的 OpenShift 模板(二进制源策略)
- java - 如何在 JAVA 中使用 selenium 单击此输入文件的浏览按钮?
- ruby - ruby 中使用 watir 的语法错误
- excel - Excel公式:检查每个Col1唯一值,如果COL2有重复,那么Col3不应该是唯一的
- javascript - 使用 Angular 5 中的服务在两个不相关的组件之间共享数据