w3schools tutorial then promises nodejs catch await async javascript promise

javascript - tutorial - Promesa dentro de la promesa: ¿cuál es la forma correcta de devolver una variable de la promesa infantil?(JS)



then javascript (3)

El desafío aquí es que está tratando de usar el código asíncrono de manera sincrónica. Deberá cambiar la forma en que piensa al trabajar con código asíncrono.

Una forma de resolver esto es haciendo que top () devuelva ParentPromise, y luego configure la variable myresult usando el .then () de la devolución de esa promesa.

function top() { ... return ParentPromie; } var myresult = ''''; // default value until you have resolved your promise top().then(result => myresult = result);

Sin embargo, para que esto funcione, deberá agregar código para resolver su promesa:

var ParentPromise = new Promise(function(resolve) { ... some code... var ChildPromise = new Promise(function(){ ...some code... }).then(function(response){ resolve(response.result.items); }); });

Tengo una función como esta:

function top() { //promise1 ParentPromise({ ...some code here... }).then(function() { //promise2 ChildPromise({ ..some code here... }).then(function(response) { var result = response.result.items; }); }); };

y necesito devolver el valor del resultado de esta manera:

var myresult = start();

como puedo hacer eso? Gracias


La definición de promesas es que literalmente no se puede asignar un result a myresult . Sin embargo , puede hacer que myresult una promesa que se resuelva directamente para obtener un result para la persona que llama, sin embargo, se utilizaron muchas promesas para myresult . La idea básica es que dentro de cada función en su bloque anterior, debe return la Promesa siguiente en la cadena. p.ej:

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; }); }); };

Al final, el código que llama a top() no sabrá ni le importará que se hayan utilizado promesas encadenadas de 1, 2 o 12 para obtener result . También podrá registrar una devolución de llamada de error en caso de que alguna de esas promesas haya fallado.


No estoy seguro de si esto funcionaría con las promesas nativas de JS, pero en PromiseKit (swift ... lo sé, pero estoy bastante seguro de que debería funcionar) estoy acostumbrado a devolver la segunda promesa, y lo encadeno así:

function top() { //promise1 return ParentPromise({ ...some code here... }).then(function() { //promise2 return ChildPromise({ ..some code here... }) }).then(function(response) { var result = response.result.items; // do something with `result` return result; }); } top().then(function(result){ // all done });

O en notación ES6 / lambda;

function top() { return ParentPromise().then(_ => { return ChildPromise() }).then(response => { return response.result.items }) } top().then(items => { // all done })