Versprechen innerhalb des Versprechens: Was ist der richtige Weg, um eine Variable aus dem untergeordneten Versprechen zurückzugeben? (JS)
Lesezeit: 4 Minuten
Ich habe eine Funktion wie diese:
function top() {
//promise1
ParentPromise({
...some code here...
}).then(function() {
//promise2
ChildPromise({
..some code here...
}).then(function(response) {
var result = response.result.items;
});
});
};
und ich muss den Ergebniswert auf diese Weise zurückgeben:
var myresult = start();
Wie kann ich das tun? Danke
Wie ist start im Zusammenhang mit top? Willst du ParentPromise zu lösen result?
– Felix Klinge
10. Mai 2017 um 14:32 Uhr
Es ist ein Google-API-Aufruf. Gibt es eine Möglichkeit, “Rückgabeergebnis” zu erhalten? Ich weiß nicht, wie eine globale Variable
– Valerio Marzulli
10. Mai 2017 um 14:36 Uhr
Mögliches Duplikat von How to chain and share prior results with Promises
– Erasihel
10. Mai 2017 um 14:39 Uhr
Katana314
Die Definition von Versprechen ist, dass man sie nicht buchstäblich zuordnen kann result zu myresult. Jedochdu kannst das schaffen myresult ein Versprechen, das direkt auflöst result Für den Anrufer wurden jedoch viele Versprechungen verwendet, um dies zu erreichen. Die Grundidee ist, dass Sie in jeder Funktion in Ihrem obigen Block sein sollten returndas nächste Versprechen in der Kette. z.B:
function top() {
//promise1
return ParentPromise({
...some code here...
}).then(function() {
//promise2
return ChildPromise({
..some code here...
}).then(function(response) {
var result = response.result.items;
return result;
});
});
};
Am Ende ruft der Code top() wird nicht wissen oder sich darum kümmern, dass 1, 2 oder 12 verkettete Versprechen verwendet wurden, um zu bekommen result. Es wird auch in der Lage sein, einen Fehlerrückruf zu registrieren, falls eines dieser Versprechen fehlschlägt.
ok ich verstehe, jetzt verstehe ich [object Object] in Konsole. Wie kann ich das Ergebnis richtig drucken?
– Valerio Marzulli
10. Mai 2017 um 14:49 Uhr
@ValerioMarzulli Ich bin mir nicht sicher, wie ich helfen soll, da Ihr Beispielcode keine console.log() hatte, daher weiß ich nicht genau, wie Sie das Ergebnis abrufen/verwenden möchten. Aber ein Beispiel wäre: top().then(function(result) { console.log(result); }. Bevor Sie fragen, nein, Sie können nicht bekommen result während desselben Funktionsaufrufs – weshalb wir Promises und Callbacks haben.
– Katana314
10. Mai 2017 um 15:02 Uhr
Erik Terwan
Der sauberste Weg ist meiner Meinung nach, das Versprechen zurückzugeben und sie “unten” anstatt links zu verketten, um eine weihnachtsbaumartige Rückrufhölle zu vermeiden.
function top() {
//promise1
return ParentPromise({
...some code here...
}).then(function(parent) {
//promise2
return ChildPromise(parent.id)
}).then(function(response) {
// do something with `result`
return response.result.items;
});
}
top().then(function(items){
// all done
});
Ja, JavaScript Promises funktioniert so. IMHO, deine ist die beste Lösung.
– Falsarella
17. November 2017 um 20:28 Uhr
Die Herausforderung besteht darin, dass Sie versuchen, asynchronen Code synchron zu verwenden. Sie müssen Ihre Denkweise ändern, wenn Sie mit asynchronem Code arbeiten.
Eine Möglichkeit, dies zu lösen, besteht darin, top() ParentPromise zurückgeben zu lassen und dann die Variable myresult mithilfe von .then() der Rückgabe dieses Promise festzulegen.
function top() {
...
return ParentPromie;
}
var myresult=""; // default value until you have resolved your promise
top().then(result => myresult = result);
Damit dies funktioniert, müssen Sie jedoch Code hinzufügen, um Ihr Versprechen aufzulösen:
var ParentPromise = new Promise(function(resolve) {
... some code...
var ChildPromise = new Promise(function(){
...some code...
}).then(function(response){
resolve(response.result.items);
});
});
Das bedeutet, dass das untergeordnete Versprechen nicht aufgelöst wird, daher wird es dann nicht einmal aufgerufen, daher wird das übergeordnete Versprechen auch nicht aufgelöst, was zu einem Speicherleck von 2 ausstehenden Versprechen führt.
– Falsarella
17. November 2017 um 20:28 Uhr
Die am meisten akzeptierte Methode, asynchronen Code so zu schreiben, als wäre er synchron, ist die Verwendung von async … await
– Erik Wasser
2. Oktober 2018 um 15:01 Uhr
Führen Sie den folgenden Code aus und erweitern Sie ihn, um ihn an Ihre spezifischen Umstände anzupassen. Beachten Sie, wie es das Zurückgeben von Promises veranschaulicht und an verschiedenen Punkten auf dem Weg Logik hinzufügt, vor, während und nach der Behandlung verschiedener ausstehender Logik.
function ParentPromise(){
// add complexity here, always returning a promise(s)
// ie Promise.all, new Promise, Promise.reject or whatever...
// here for simplicity, just return one to resolve with a clear value
// to see it at the other end
return Promise.resolve({items:1234});
}
function start() {
// any method that returns the first promise, kicking off the complexity
return ParentPromise(/*
infinitely complex promise-conflation (individual or Promise.all, etc)
only requirement is that each ***return a promise***
where each is resolved or rejected
*/)
.then((result) => {
// do something with `result`
console.log(result.items);
// note returning what we want to come out **next**
return result;
});
};
var myresult;
start()
.then((result)=>{ myresult = result; })
.finally(()=>{ console.log('myresult:',myresult); });
Je nachdem, was Sie wollen
Nehmen wir an, Sie haben ein Modell und einen Rahmen, Sie haben so etwas:
function promiseInsidePromise(req, res) {
axios.get("example.com/api")
.then(result => {
// do something
result = result + 1;
})
.then(result => {
// call the other promise and return it into the chain
return model.createOrder(result);
})
.catch(error => {
handleError(error, req, res);
});
}
Sie rufen das andere Versprechen auf, geben aber seinen Wert in die Hauptkette zurück
return model.createOrder();
14036100cookie-checkVersprechen innerhalb des Versprechens: Was ist der richtige Weg, um eine Variable aus dem untergeordneten Versprechen zurückzugeben? (JS)yes
Wie ist
start
im Zusammenhang mittop
? Willst duParentPromise
zu lösenresult
?– Felix Klinge
10. Mai 2017 um 14:32 Uhr
Es ist ein Google-API-Aufruf. Gibt es eine Möglichkeit, “Rückgabeergebnis” zu erhalten? Ich weiß nicht, wie eine globale Variable
– Valerio Marzulli
10. Mai 2017 um 14:36 Uhr
Mögliches Duplikat von How to chain and share prior results with Promises
– Erasihel
10. Mai 2017 um 14:39 Uhr