首页 > 解决方案 > 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();

标签: javascriptpromise

解决方案


Promise.all如果链中的至少一个 Promise 抛出错误或拒绝它,该方法将捕获错误。

看来你的一个承诺有一个例外。

您可以简单地添加以下内容来调试它catch

Promise.all(PromiseList).then(()=>console.log("all works done") ).catch(errors=>console.log("something wrong",errors))


推荐阅读