Promises.all при одиночном обещании возвращает объект, а не массив - нельзя использовать forEach для возвращаемых данных без проверки на массив - PullRequest
0 голосов
/ 04 октября 2019

Как обрабатывать одно и несколько обещаний в одном коде Promise.all ()? 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);
});

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Обещание, возвращаемое 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' };
}
0 голосов
/ 04 октября 2019

Вы должны проверить, что 'data' имеет тип Array, прежде чем использовать (досадно)

if ( Array.isArray(data) ) {
  data.forEach( function(f) { 
    console.log("Uploaded:", f.name); }
  );
}
else {
  console.log("Uploaded:", data.name); 
}
...