Esta es la primera vez que uso promesas, así que estoy seguro de que hay errores bastante tontos aquí. Lo que estoy tratando de hacer es enviar una solicitud http en un bucle for.
Al hacer esto sin la promesa, puedo ejecutar bien este bucle y todo funciona correctamente. sin embargo, cuando hago esto con la promesa, solo devuelve un objeto (debe ser múltiple, ya que envía múltiples solicitudes)
este es mi codigo
function run(o,initialvalue){ const test = new Promise( (resolve,reject) => { const collectionCountUrl = 'https://x.io/rpc/Query?q=%7B%22%24match%22%3A%7B%22collectionSymbol%22%3A%22'+o.name+'%22%7D%2C%22%24sort%22%3A%7B%22takerAmount%22%3A1%2C%22createdAt%22%3A-1%7D%2C%22%24skip%22%3A'+initialvalue+'%2C%22%24limit%22%3A500%7D' promises = [] for(i=0; i < o.count(/*in this case 60, so 3 requests*/); i+= 20){ $.get(collectionCountUrl).success(resolve).fail(reject) // This should be sending multiple of the requests above, correct? ^ } }) test.then(function(data){ console.log(data) // this should return the data from each request? im not sure }) }Intenté revisar esta publicación para ver si estaba configurando mal el bucle for, pero no creo que lo esté. Promise for-loop con solicitudes Ajax
Una promesa es para un solo resultado. Debe envolver cada solicitud en una promesa separada (mover la llamada del constructor al ciclo) y almacenar las promesas en una matriz.
Luego, puede usar métodos de agregación como Promise.all (otros son Promise.allSettled , Promise.race y Promise.any ) para obtener una única promesa de una serie de resultados que puede esperar.
Como esto:
function run(o,initialvalue){ const collectionCountUrl = 'https://x.io/rpc/Query?q=%7B%22%24match%22%3A%7B%22collectionSymbol%22%3A%22'+o.name+'%22%7D%2C%22%24sort%22%3A%7B%22takerAmount%22%3A1%2C%22createdAt%22%3A-1%7D%2C%22%24skip%22%3A'+initialvalue+'%2C%22%24limit%22%3A500%7D' const promises = [] // ^^^^^----+--- don't forget to declare all your variables // vvv--+ for(let i=0; i < o.count(/*in this case 60, so 3 requests*/); i+= 20){ promises.push(new Promise( (resolve,reject) => { $.get(collectionCountUrl).success(resolve).fail(reject) })) } //You've got an array of promises, let's convert it to a single one that resolves when everything's done: const test = Promise.all(promises) test.then(function(data){ //This will run when all the requests have succeeded //`data` is an array of results console.log(data) }) }Esto funcionará, ¡pero hay una manera aún mejor!
Los objetos $.Deferred de jQuery (como el que obtienes de $.get ) también tienen un método .then() como las promesas, y aunque no es una promesa real , puedes usarla como si lo fuera. Tales objetos se llaman then ables .
Entonces, en lugar de esta cosa...
promises.push(new Promise( (resolve,reject) => { $.get(collectionCountUrl).success(resolve).fail(reject) }))... puedes hacer esto:
promises.push( $.get(collectionCountUrl) )Entonces, aquí está el código final:
function run(o,initialvalue){ const collectionCountUrl = 'https://x.io/rpc/Query?q=%7B%22%24match%22%3A%7B%22collectionSymbol%22%3A%22'+o.name+'%22%7D%2C%22%24sort%22%3A%7B%22takerAmount%22%3A1%2C%22createdAt%22%3A-1%7D%2C%22%24skip%22%3A'+initialvalue+'%2C%22%24limit%22%3A500%7D' const promises = [] for(let i=0; i < o.count(/*in this case 60, so 3 requests*/); i+= 20){ promises.push( $.get(collectionCountUrl) ) } //You've got an array of promises, let's convert it to a single one that resolves when everything's done: const test = Promise.all(promises) test.then(function(data){ //This will run when all the requests have succeeded //`data` is an array of results console.log(data) }) }