Promise.all не работает как задумано - PullRequest
0 голосов
/ 04 июля 2018

У меня есть несколько асинхронных вызовов, которые я хочу выполнить перед моим последним вызовом, и у меня есть метод, подобный этому stackoverflow-ответу .

Вот код в Codepen

class Person {
  name: string;
  constructor(init){
    this.name = init;
  }
}
let people: Person[] = [];
let names:string[] = ['janes','james','jo','john','josh'];
names.forEach(n=>people.push(new Person(n)));
function printName(name:string) {
  let getSomething = new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(name);  
    },1000)
  });
  getSomething.then(function(){
    console.log(name);
  });
}
/// main
let request = [];
console.log('start');
people.forEach(person => { 
  request.push(printName(person.name));
})
Promise.all(request).then(result=> {
  console.log(result);
  console.log("finsh");
})

Что произвел вышеуказанный код:

"start"
[undefined, undefined, undefined, undefined, undefined]
"finsh"
"janes"
"james"
"jo"
"john"
"josh"

в то время как я ожидаю:

"start"
"janes"
"james"
"jo"
"john"
"josh"
[undefined, undefined, undefined, undefined, undefined]
"finsh"

1 Ответ

0 голосов
/ 04 июля 2018

Вы не возвращаете обещания, созданные в printName, в массив request, поэтому Promise.all вызывается для массива undefined s (и, как результат, разрешается немедленно). Вместо этого зацепите и верните обещания.

Часто, когда вы используете Promise.all, вы хотите, чтобы разрешенный массив содержал значения, а не undefined s - для этого также возвращайте name внутри getSomething.then, чтобы Promise.all разрешится с массивом имен:

function printName(name:string) {
  let getSomething = new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(name);  
    },1000)
  });
  return getSomething.then(function(){
    console.log(name);
    return name; // add this line too
  });
}

Рабочий фрагмент в обычном Javascript:

class Person {
  constructor(init){
    this.name = init;
  }
}

let people = [];
let names = ['janes','james','jo','john','josh'];
names.forEach(n=>people.push(new Person(n)));

function printName(name) {
  let getSomething = new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(name);  
    },1000)
  });
    return getSomething.then(function(){
      console.log(name);
      return name;
    });
}
let request = [];
console.log('start');
people.forEach(person => { 
  request.push(printName(person.name));
})
Promise.all(request).then(result=> {
  console.log(result);
  console.log("finsh");
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...