Versprechen.alle() ist keine Lösung verspricht, in der erwarteten Reihenfolge

Wenn ich verstehe, Versprechen.alle() richtig, ich würde erwarten, dass dieser code zu nehmen, 5 Sekunden vor der Ausgabe nur der Grund für die abgelehnte Versprechen an die Konsole.

function firstAsyncFunction() {
  return new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve(console.log('First async function has been resolved!'));
    }, 500);
  });    
}

function secondAsyncFunction() {
  return new Promise(function(resolve, reject) {
    setTimeout(function(){
      resolve(console.log('Second async function has been resolved!'));
    }, 2000);
  });
}

function thirdAsyncFunction() {
  return new Promise(function(resolve, reject) {      
    setTimeout(function() {              
      reject('Internal server error'); //rejected for some reason
    }, 5000);    
  });
};

Promise.all([secondAsyncFunction(), firstAsyncFunction(), thirdAsyncFunction()])
    .then(function(values){        
      values.forEach(function(value){
        console.log(value);
      });

    }).catch(function(err){
      console.log(err);
    });

Statt, die ersten beiden Versprechen lösen, dann die endgültige Versprechen ablehnt. Darüber hinaus werden die ersten beiden Versprechen nicht selbst auflösen, in der Reihenfolge, in der Sie übergeben werden, zu Versprechen.alle(). Muss ich Komponieren meine verspricht anders zu sehen, das Verhalten, das ich erwarte?

Bearbeitet

Versprechen.alle() ist in der Tat warten, bis die Versprechungen in der iterierbar an Sie übergeben beheben. Mein Erster Anhaltspunkt war die Tatsache, dass die Konsole die Ausgabe undefiniert (Dank Jaromanda X). Wenn ich entfernen Sie die Anrufe auf die Konsole.log() in der Auflösung zu firstAsyncFunction() und secondAsyncFunction() das folgende Stück code funktioniert genau so wie ich es erwarten würde:

function firstAsyncFunction() {
  return new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve('First async function has been resolved!');
    }, 1000);
  });    
}

function secondAsyncFunction() {
  return new Promise(function(resolve, reject) {
    resolve('Second async function has been resolved!');      
  });
}

function thirdAsyncFunction() {
  return new Promise(function(resolve, reject) {      
    setTimeout(function() {      
      reject('Internal server error');
    }, 5000);
  });
};

Promise.all([
  thirdAsyncFunction(), 
  firstAsyncFunction(), 
  secondAsyncFunction()
])
 .then(function(values){        
   values.forEach(function(value){
     console.log(value);
   });
 })
 .catch(function(err){
   console.log(err);
 });

Nach fünf Sekunden sehe ich "Internal server error". Versprechen.alle() lehnt die andere verspricht, obwohl Sie beheben früher, als das Versprechen, dass abgelehnt wurde. Und ja, die Werte gelöst Versprechen.alle() werden in der gleichen Reihenfolge wie die Versprechungen in der iterierbar als parameter übergebenen. Vielen Dank für Ihre Hilfe!

Noch ein Beispiel:

function firstAsyncFunction() {
  return new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve('First async function has been resolved!');
    }, 1000);
  });    
}

function secondAsyncFunction() {
  return new Promise(function(resolve, reject) {
    resolve('Second async function has been resolved!');      
  });
}

function thirdAsyncFunction() {
  return new Promise(function(resolve, reject) {      
    setTimeout(function() {
      resolve({
        users: [
          { name: 'Ronnie', age: 22 },
          { name: 'Bobby', age: 21 },
          { name: 'Ricky', age: 21 },
          { name: 'Mike', age: 20 }
        ]
      });
    }, 5000);
  });
};

Promise.all([thirdAsyncFunction(), firstAsyncFunction(), secondAsyncFunction()])
  .then(function(values){        
    values.forEach(function(value){
      console.log(value);
    });
  })
  .catch(function(err){
    console.log(err);
  });

Nach fünf Sekunden, wird dieser code ausgegeben:

{ users: 
   [ { name: 'Ronnie', age: 22 },
     { name: 'Bobby', age: 21 },
     { name: 'Ricky', age: 21 },
     { name: 'Mike', age: 20 } ] }
First async function has been resolved!
Second async function has been resolved!

Genau das, was wir wollen.

Die Reihenfolge der verspricht, Sie zu füttern, zu Promise.all ist irrelevant.
torazaburo, das ist nicht ganz richtig. Die Werte gelöst Versprechen.alle() werden in der gleichen Reihenfolge wie die iterierbar übergeben Sie als parameter.
Die wichtige Sache zu erkennen ist hier, dass verspricht Darstellung des die Ergebnisse der bereits in Betrieb. Damit alle Betreiber, die nimmt Versprechen und keine Funktionen für verspricht nicht etwas aufzwingen wirklich.

InformationsquelleAutor James Hines | 2015-08-08

Schreibe einen Kommentar