Javascript Promise.all тогда не работает - PullRequest
0 голосов
/ 13 июля 2020

У меня есть ряд обещаний.

Я так и не смог распечатать журнал консоли «Обработанные папки». Выполнение, кажется, останавливается, как только достигает первого вызова 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();

Ответы [ 4 ]

1 голос
/ 13 июля 2020

Функция возвращается до выполнения любого вызова Promise, это должно быть continue. Поэтому сначала разрешите его.

const exportFolderToCsv = async (folder) => {
  // ...

  for (const folderItem of folder.items) {
    if (folderItem.isFolder && folderItem.items.length > 0) {
      subfolders.push(folderItem)
      return // here lies the problem, it should be `continue` instead
    }

    promises.push(processFolderItem(folderItem))
  }

  // ...
}
1 голос
/ 13 июля 2020

Если вы используете ожидание, в цепочке нет смысла.

let response = await Promise.all(promises);
console.log('Processed subfolders', response)
1 голос
/ 13 июля 2020

Ваши обещания будут сопровождаться ошибками, и вам необходимо учитывать неудачные ситуации. В то же время, Promise.all остановится, если одно из обещаний не выполнено, поэтому, возможно, ваш Promise.all не сработал.

try {
  Promise.all(promises).then(response => console.log('Processed subfolders', response));
} catch (err) {
  console.log(err);
}
// or to check your promise result
const folderResult = await Promise.all(promises);

, чтобы проверить точный результат

1 голос
/ 13 июля 2020

Метод Promise.all перехватывает ошибки, если хотя бы одно обещание в цепочке вызывает ошибку или отклоняет ее.

Кажется, что одно из ваших обещаний вызвало исключение.

Вы можно отладить, просто добавив catch вот так:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...