2016-07-11 7 views
0

Meine Frage beinhaltet Versprechen und bietet vorherige Werte von Kettenversprechen. Die Frage ist, ob das Item vom ersten Rückgabeversprechen an das zweite Versprechen "runItem -> testItem" übergeben wurde?Bereitstellung früherer Werte von Versprechen

Oder müssen wir den Gegenstand durch alle Versprechen gehen?

Beispiel:

db.items.find({_id: id}).then(function (res) { 
 
    runItem(item); 
 
}) 
 

 
function runItem(item) { 
 
    removeFromQueue(item.id).then(function() { 
 
    testItem(item); 
 
    }); 
 
} 
 

 
function testItem(item) { 
 
    ... 
 
} 
 
    
 
function removeFromQueue(item) { 
 
    return db.queue.remove({_id: item._id}); 
 
}

EDIT: Vielleicht wäre dies ein besseres Beispiel sein:

Können wir original Attribut Element zugreifen, oder ist es überschrieben werde, wenn die nächste Zeitfunktion wird aufgerufen?

function start(id) 
 
    db.find({_id: id}).then(function (item) { 
 
    test(item).then(function (res) { 
 
     // can we access original attribute item, or is it going to be overwritten when the next time function is called 
 
     resolve({ res: res, item: item }); 
 
    }); 
 
    }); 
 
} 
 

 
function test(item) { 
 
    return $test(item).then(function() { 
 
    resolve('success'); 
 
    }); 
 
}

+0

Sie sollen die Versprechen Objekte zurückzukehren. – thefourtheye

+0

Ich verstehe nicht, was Sie mit Ihrem Code zu tun versuchen, aber nein, die vorherigen Werte werden nicht gespeichert, Sie müssen sie speichern, wenn Sie sie benötigen (in einigen Fällen ist es bequem, die Fähigkeit von Bluebird Versprechungen zu verwenden an ein Objekt gebunden sein). –

+0

Ich möchte "Element" an testItem Funktion übergeben, aber "Element" ist ein Attribut in RunItem-Funktion. Der Code ist allgemein, meistens möchte ich nur wissen, ob es möglich ist, und wenn nicht, was ist der beste Weg, Variablen von einem Versprechen zum anderen zu übergeben. – puppeteer701

Antwort

0

Sie können den Rückgabewert einer früheren Versprechen ändern und sie einfach zurück. Das nächste Versprechen wird beeinflusst. Überprüfen Sie folgendes Beispiel:

var promise = new Promise(function(res,rej){ res({data: 7}) }); // start with {data:7} 
 
var promise1 = promise.then(function(res){ console.log('promise.then: ' + JSON.stringify(res)); return res.data; }); // log: {data:7}. return: 7 
 
var promise2 = promise1.then(function(res) { console.log('promise1.then : ' + res); return res + 1;}); // log:7. return 8. 
 
var promise3 = promise2.then(function(res) { console.log('promise2.then: ' + res); return res;}); // log:8. return 8. 
 
var promise4 = promise3.then(function(res) { console.log('promise3.then: ' + res); return res;}); // log:8. return 8.

+0

'Promise.resolve ({data: 7})', keine Notwendigkeit für den Konstruktor. –

-1

Das Beispiel, das Sie gebucht haben nicht kehrt promise Objekt.

Unten ist ein Beispiel für die Verkettung Dinge in promise, werfen Sie einen Blick.

functionA = function(text) {return new Promise(function(resolve) { 
resolve(text); 
console.log(text + " at function A"); 
}); 
} 

functionB = function(text) {return new Promise(function(resolve) { 
resolve(text); 
console.log(text + " at function B"); 

});} 


functionA("test").then(function (res) 
{ 
console.log(res + " at then"); 
runItem(res); 

}) 

function runItem(item) { 
functionB(item).then(function (res) { 
console.log(res + " at Function Run Item"); 
testItem(res); 

}); 
} 

function testItem(item) { 
console.log(item + " at Function testItem"); 
} 

im obigen Beispiel Sie die runItem(item) ‚s sehen item zu promise Objekt von functionB übergeben wird, die wen kehrt das gleiche in then wie res aufgelöst, die weiter von testItem(res) verwendet wird.

, wenn Sie irgendeine Operation tun wollen auf runItem(item) ‚s item Sie können es ändern, bevor das Versprechen FunctionB für aufgelöst wird

+0

Es ist ein Beispiel, db.queue = Mongodb-Auflistung.Aus Ihrem Beispiel, was ich sehe, muss ich den Gegenstand als Lösungsdaten durch alle Versprechen leiten. Gibt es einen Weg, der es mir erlaubt, durchzugehen, ohne es in einen Auflösungsruf zu setzen? – puppeteer701

0

Versuchen Promise.props Funktion.

So etwas wie

... 
{ 
    ... 
    return Promise.props({res: res, item: item}). 
     .then(function(result){ 
      return Promise.resolve({ res: res, item: item }); 
     }); 
}