2016-07-30 13 views
2

Ich versuche, Promise Verkettung funktioniert für mich richtig.Erstellen von Funktionen, um Versprechen richtig zu verketten

Ich glaube, das Problem nach unten läuft darauf hinaus zwischen dem Unterschied zu verstehen:

promise.then(foo).then(bar); 

und:

promise.then(foo.then(bar)); 

In dieser Situation Ich schreibe sowohl foo und bar und die Unterschriften zu bekommen versuchen Recht . bar nimmt einen Rückgabewert, der von foo erzeugt wird.

Ich habe das letzte Arbeiten, aber meine Frage ist, was ich tun muss, um das ehemalige Arbeiten zu erhalten?

In Bezug auf die oben genannten ist der vollständige Code (unten). Ich habe nicht die verschiedene Protokolle in der Reihenfolge gedruckt, ich erwarte (erwarteten log1, log2, log3, log4, log5, aber immer log3, log4, log5, log1, log2). Ich hoffe, dass ich, wenn ich das oben erfahre, das auch richtig machen werde.

var Promise = require('bluebird'); 

function listPages(queryUrl) { 
    var promise = Promise.resolve(); 

    promise = promise 
    .then(parseFeed(queryUrl) 
     .then(function (items) { 

     items.forEach(function (item) { 
     promise = promise.then(processItem(transform(item))) 
        .then(function() { console.log('log1');}) 
        .then(function() { console.log('log2');}); 
     }); 

    }).then(function() {console.log('log3')}) 
).then(function() {console.log('log4')}) 
    .catch(function (error) { 
    console.log('error: ', error, error.stack); 
    }); 
    return promise.then(function() {console.log('log5');}); 
}; 
+2

Der zweite ist einfach falsch. 'then' nimmt einen Rückruf als Argument, kein Versprechen. – Bergi

+0

@Bergi - Wenn ich dem 'then' ein anderes Versprechen geben will, muss ich nur sicherstellen, dass der Callback das Versprechen zurückgibt? – Vineet

+1

@Vineet yup, Sie müssen eine Funktion übergeben, die ein Versprechen zurückgibt, nicht das Versprechen selbst. – nem035

Antwort

2

Was ist der Unterschied zwischen promise.then(foo).then(bar); und promise.then(foo.then(bar));?

Die zweite ist einfach falsch. Die then-Methode verwendet einen Rückruf als Argument, kein Versprechen. Der Rückruf könnte ein Versprechen zurück, so dass die ersten, die

promise.then(function(x) { return foo(x).then(bar) }) 

entsprechen (unter der Annahme, dass foo ein Versprechen als auch zurückgibt).


Ihr gesamter Code scheint etwas durcheinander zu sein. Es sollte wahrscheinlich lesen

function listPages(queryUrl) { 
    return parseFeed(queryUrl) 
    .then(function (items) { 
     var promise = Promise.resolve(); 
     items.forEach(function (item) { 
      promise = promise.then(function() { 
       console.log('log1'); 
       return processItem(transform(item)); 
      }).then(function() { 
       console.log('log2'); 
      }); 
     }); 
     return promise; 
    }).then(function() { 
     console.log('log3') 
    }, function (error) { 
     console.log('error: ', error, error.stack); 
    }); 
} 
+0

Gibt es einen Grund, warum Sie die 'var promise = Promise.resolve();' innerhalb des Callbacks verschoben haben? Würde es nicht funktionieren, wenn es draußen wäre? (Ich stimme zu, dass Ihr Code sauberer ist, aber ich versuche nur, meine Verständnislücken zu finden). – Vineet

+1

@Vineet: Ja, Sie sollten Variablen so lokal wie möglich halten. Es hätte funktioniert, um es auch in einem äußeren Bereich zu initialisieren, aber in deinem ursprünglichen Code hast du "Versprechen versprechen" von der "listPages" -Funktion zurückgegeben, was nicht funktioniert, wenn "Versprechen" nur im asynchronen Callback zugewiesen wird. Man hätte sogar die Variable und die Zuweisung vollständig vermeiden können (sollte?) Und "reduce" anstelle von "forEach" verwendet. Der wichtige Teil ist, dass das 'Versprechen' vom' then' Callback zurückgegeben wird. – Bergi

Verwandte Themen