sincronas secuencial orden funciones encadenar ejecucion asincrono asincronismo asincronia asincronas javascript node.js asynchronous promise

javascript - orden - jquery ejecucion secuencial



Pasar el cambio de valor a la función asincrónica (1)

En el siguiente código, estoy agregando un valor para peinar, tratando de usar ese valor en una función asincrónica, y luego cambiando el valor de peine. El valor de peine dentro de la solicitud no es el deseado ya que comb.pop () ocurre varias veces antes de que se activen las devoluciones de llamada de la solicitud. Después de buscar muchas preguntas sobre el desbordamiento de la pila, he intentado cerrar una solicitud que tomó el peine como entrada, pero no funcionó. ¿Cómo debo ir sobre esto?

comb = [1,2,3]; arr = [10,20,30]; promises = []; for (var i = 0; i < arr.length; i++) { comb.push(arr[i]); var promise = new Promise(function(resolve, reject) { request(url, function(err, res, body) { // use comb if (/* comb meets certain condition */) resolve(body); }); }); promises.push(promise); comb.pop(); }

Aquí está mi intento de usar un cierre, que no funcionó:

var promise = new Promise(function(resolve, reject) { (function(comb) { request(url, function(err, res, body) { // use comb if (/* comb meets certain condition */) resolve(body); }); })(comb); });


Esto funcionará para tipos simples:

var promise = (function(combCopy){ var ret = new Promise(function(resolve, reject) { request(url, function(err, res, body) { //comb refers to the outside comb //combCopy refers to the copy }); }); return ret; })(comb);

Los objetos siempre pasan por referencias, por lo que pasar un objeto como parámetro no copiará el objeto. Tendrás que hacer eso manualmente.

var promise = (function(){ //this creates a new scope -- something that might not be necessary var combCopy = Array.prototype.slice.call(comb); //shallow-only var ret = new Promise(function(resolve, reject) { request(url, function(err, res, body) { //comb refers to the outside comb //combCopy refers to the copy }); }); return ret; })();