2015-09-16 15 views
13

als Kommentar EDITED ich zu duplizieren zitiere aus: [How do I return the response from an asynchronous call?Wie den zurückgegebenen Wert eines Versprechens einer Variablen zuweisen?

Promises are containers for future values. When the promise receives the value (it is resolved) or when it is cancelled (rejected), it notifies all of its "listeners" who want to access this value.

Diese Frage ist, wie der Wert in dem Versprechen enthalten zurückzukehren. Die Antwort war nützlich für mich, weil es klargestellt, dass es nicht möglich ist, den Wert den Wert, sondern auf Zugriff auf den Wert innerhalb die Versprechen Funktion.

Weitere nützliche Quellen über das Thema, hier:

Unterhalb der ursprünglichen Frage:


Könnten Sie bitte helfen zu verstehen, wie der Wert von einem Versprechen und die Unterschiede zwischen diesen beiden Beispielen zu bekommen?

//I have a simple ajax call like: 

var fetch = function(start_node, end_node) { 
var apiEndpoint = 'localhost/nodes/'; 
var loadurl = apiEndpoint+start_node+'/'+end_node; 
return $.ajax({ 
    url: loadurl, 
    type: 'GET', 
    dataType: 'json', 
    jsonpCallback: 'json' 

    }); 

}; 
// Then I processed results in something like: 
    var getResult = function(data) { 
     // do smtg with data 
     var result = {'myobject' : result_from_data} 
     return result 
    } 

Und schließlich möchte ich es Ergebnisse zuweisen.

Die folgenden Werke, aber ich denke, es verschwendet das Konzept der Verheißung, da Ergebnis einer globalen Variablen, bevor er erklärt zugeordnet:

var r; 
fetch('val1','val2') 
.then(function(data){ 
    r = getResult(data); 
}) 

stattdessen folgende ordnet die Versprechen Funktion res.

var res = fetch('val1','val2') 
.done(function(data){ 
    return getResult(data); 
}) 

Können Sie klären, wie die resultierende 'myobject' auf die Variable res passieren, und nicht das Versprechen selbst?

ich auch versucht:

var res = $.when(fetch('val1','val2')) 
.done(function(data){ 
    return getResult(data); 
}) 

aber kein Erfolg.

+1

Ich denke, das ist ein Missverständnis. Es gibt keinen zurückzugebenden Wert, bis das Versprechen (asynchrones Ereignis) ausgeführt wurde. Was später erwartet wird. Die Frage ist dann - was würde mit dieser einmal zugewiesenen Variablen passieren? Könnten Sie Ihr Design in Bezug auf Ereignisse und Rückrufe berücksichtigen? –

+3

Sie können nicht tun, was Sie versuchen zu tun. Async ist Async - das Ergebnis ist einfach nicht verfügbar bis SPÄTER, lange nachdem Ihre Funktion bereits zurückgegeben wurde. Sie müssen den Code, der Ihr Ergebnis verwendet INSIDE die Callback-Funktion abschließen oder eine Funktion innerhalb dieses Callbacks aufrufen und die Daten als Argument übergeben. All die anderen Antworten, auf die du dich beziehst, sagen dir das auch. Du glaubst es anscheinend einfach nicht. – jfriend00

+1

Zeigen Sie uns, wo Sie * das * res 'mit diesem' myobject'-Ding benutzen werden.Was Sie zu tun versuchen, ist genau das, was Sie mit dieser globalen "r" -Variable gemacht haben - und tatsächlich verschwendet es das Konzept der Versprechen und könnte in Randfällen nicht funktionieren. Sie sollten einfach 'fetch (...) .then (getResult) .then (function (res) {...});' – Bergi

Antwort

8

Sie haben den globalen Variable Trick, nutzen oder speichern-as-a-Versprechen Trick akzeptieren.

var getStuff = $.when(req1,req2).then(function(data1,data2) { return data1.concat(data2); }); 

//the variable getStuff is now a promise and any .then chained 
//to it will have data1.concat(data2) passed to it as an argument 

getStuff 
    .then(function(data1Data2) { 
    console.log(data1Data2); 
    }); 

//the next time you want to use it, you have to use the same promise-interface with .then 
getStuff 
    .then(function(data1Data2) { 
    console.log(data1Data2); 
    }); 
+0

Danke! Also die einzige Möglichkeit, die Variable innerhalb des Versprechens selbst zu verwenden. – user305883

+0

Danke! Es ist also möglich, nur innerhalb des Versprechens auf den Wert des Versprechens zuzugreifen. Ein wenig weiter: @Adam, ich führe die 'getStuff . Dann (Funktion (Daten1Data2) { console.log (Daten1Data2); }); 'in der Browser-Konsole, und es gibt sowohl den Wert und _die Verheißung selbst_ zurück. (zB: 'Object {'myobject': result_from_data}, Objekt {}' Können Sie erklären warum? – user305883

+2

Es gibt nicht sowohl den Wert als auch das Versprechen selbst zurück - diese Anweisung gibt das Versprechen zurück (welches die Browser-Konsole protokolliert) und Es ist auch 'console.log' ist die Daten, weshalb Sie zwei Protokolle sehen. Ihre zwei Optionen sind, wie Sie sagten - verwenden Sie eine globale Variable, oder speichern Sie einfach das Versprechen und immer Zugriff auf seine Daten über eine' .then ' – Adam

Verwandte Themen