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