una trabajar recursividad promesas promesa platzi hacer encadenamiento ejemplos con como javascript recursion promise

trabajar - recursividad javascript ejemplos



Promesa Recursiva en javascript (3)

Aquí está la solución simplificada:

const recursiveCall = (index) => { return new Promise((resolve) => { console.log(index); if (index < 3) { return resolve(recursiveCall(++index)) } else { return resolve() } }) } recursiveCall(0).then(() => console.log(''done''));

Estoy escribiendo una Promise Javascript que encuentra la URL de redireccionamiento final de un enlace.

Lo que estoy haciendo es hacer una solicitud HEAD en una Promise usando un XMLHttpRequest . Luego, en la carga, verifique el estado HTTP para ver si hay algo en el rango 300, o si tiene una responseURL adjunta al objeto y esa URL es diferente a la que tenía.

Si ninguno de estos son verdaderos, resolve(url) . De lo contrario, recursivamente llamo a getRedirectUrl() en la URL de respuesta y resolve() .

Aquí está mi código:

function getRedirectUrl(url, maxRedirects) { maxRedirects = maxRedirects || 0; if (maxRedirects > 10) { throw new Error("Redirected too many times."); } var xhr = new XMLHttpRequest(); var p = new Promise(function (resolve) { xhr.onload = function () { var redirectsTo; if (this.status < 400 && this.status >= 300) { redirectsTo = this.getResponseHeader("Location"); } else if (this.responseURL && this.responseURL != url) { redirectsTo = this.responseURL; } if (redirectsTo) { // check that redirect address doesn''t redirect again // **problem line** p.then(function () { self.getRedirectUrl(redirectsTo, maxRedirects + 1); }); resolve(); } else { resolve(url); } } xhr.open(''HEAD'', url, true); xhr.send(); }); return p; }

Luego para usar esta función hago algo como:

getRedirectUrl(myUrl).then(function (url) { ... });

El problema es que resolve(); en getRedirectUrl llamará a then() desde la función de llamada antes de llamar a la getRedirectUrl recursiva getRedirectUrl , y en ese punto, la URL undefined está undefined .

Intenté, en lugar de p.then(...getRedirectUrl...) haciendo return self.getRedirectUrl(...) pero esto nunca se resolverá.

Mi conjetura es que el patrón que estoy usando (que básicamente se me ocurrió sobre la marcha) no es correcto, por completo.


El problema es que la promesa de devolución de getRedirectUrl() debe incluir toda la cadena de lógica para llegar a la URL. Solo estás devolviendo una promesa por la primera solicitud. El .then() que estás usando en medio de tu función no está haciendo nada.

Para arreglar esto:

Cree una promesa que resuelva redirectUrl para una redirección, o nada de lo contrario:

var p = new Promise(function (resolve) { var xhr = new XMLHttpRequest(); xhr.onload = function () { var redirectsTo; if (xhr.status < 400 && xhr.status >= 300) { redirectsTo = xhr.getResponseHeader("Location"); } else if (xhr.responseURL && xhr.responseURL != url) { redirectsTo = xhr.responseURL; } resolve(redirectsTo); }; xhr.open(''HEAD'', url, true); xhr.send(); });

Use .then() en eso para devolver la llamada recursiva, o no, según sea necesario:

return p.then(function (redirectsTo) { return redirectsTo ? getRedirectUrl(redirectsTo, redirectCount+ 1) : url; });

Solución completa:

function getRedirectUrl(url, redirectCount) { redirectCount = redirectCount || 0; if (redirectCount > 10) { throw new Error("Redirected too many times."); } return new Promise(function (resolve) { var xhr = new XMLHttpRequest(); xhr.onload = function () { var redirectsTo; if (xhr.status < 400 && xhr.status >= 300) { redirectsTo = xhr.getResponseHeader("Location"); } else if (xhr.responseURL && xhr.responseURL != url) { redirectsTo = xhr.responseURL; } resolve(redirectsTo); }; xhr.open(''HEAD'', url, true); xhr.send(); }) .then(function (redirectsTo) { return redirectsTo ? getRedirectUrl(redirectsTo, redirectCount+ 1) : url; }); }


Por favor verifique el ejemplo a continuación, devolverá factorial de un número dado como lo hicimos en muchos lenguajes de programación

He implementado el siguiente ejemplo utilizando promesas de JavaScript .

let code = (function(){ let getFactorial = n =>{ return new Promise((resolve,reject)=>{ if(n<=1){ resolve(1); } resolve( getFactorial(n-1).then(fact => { return fact * n; }) ) }); } return { factorial: function(number){ getFactorial(number).then( response => console.log(response) ) } } })(); code.factorial(5); code.factorial(6); code.factorial(7);