Aquí estoy tratando de entender las promesas. Aquí, en la primera solicitud, obtengo un conjunto de enlaces. Y en la siguiente solicitud, obtengo el contenido del primer enlace. Pero quiero hacer un retraso antes de devolver el siguiente objeto de promesa. Así que uso setTimeout en él. Pero me da el siguiente error JSON ( without setTimeout() it works just fine
)
SyntaxError: JSON.parse: carácter inesperado en la línea 1, columna 1 de los datos JSON
me gustaría saber por qué falla?
let globalObj={};
function getLinks(url){
return new Promise(function(resolve,reject){
let http = new XMLHttpRequest();
http.onreadystatechange = function(){
if(http.readyState == 4){
if(http.status == 200){
resolve(http.response);
}else{
reject(new Error());
}
}
}
http.open("GET",url,true);
http.send();
});
}
getLinks('links.txt').then(function(links){
let all_links = (JSON.parse(links));
globalObj=all_links;
return getLinks(globalObj["one"]+".txt");
}).then(function(topic){
writeToBody(topic);
setTimeout(function(){
return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine
},1000);
});
javascript
json
promise
AL-zami
fuente
fuente
return
es específica de la función y solo regresa a la función principal, y que no puede regresar de un método asincrónico.globalObj
.JSON.parse
tira? Me resulta difícil de creer que si haysetTimeout
unathen
devolución de llamada en uno afecta la llamada en lathen
devolución de llamada anterior .Respuestas:
Para mantener la cadena de promesas en marcha, no puede usar
setTimeout()
la forma en que lo hizo porque no está devolviendo una promesa del.then()
controlador, la está devolviendo desde lasetTimeout()
devolución de llamada, lo que no le sirve de nada.En su lugar, puede hacer una pequeña función de retraso simple como esta:
Y luego úsalo así:
Aquí está devolviendo una promesa del
.then()
controlador y, por lo tanto, está encadenada adecuadamente.También puede agregar un método de retraso al objeto Promise y luego usar directamente un
.delay(x)
método en sus promesas como este:O use la biblioteca de promesas Bluebird que ya tiene el
.delay()
método incorporado.fuente
delay()
devuelve una promesa que se resolverá después desetTimeout()
.v
es un valor opcional con el que le gustaría que la promesa de demora se resolviera y, por lo tanto, pasara a la cadena de promesas.resolve.bind(null, v)
está en lugar defunction() {resolve(v);}
Either will work.ACTUALIZAR:
cuando necesito dormir en la función asincrónica, agrego
fuente
La versión ES6 más corta de la respuesta:
Y luego puedes hacer:
fuente
reject
opción, por ejemplo, para la validación de eslint, entoncesconst delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms))
Si está dentro de un bloque .then () y desea ejecutar un settimeout ()
la salida será como se muestra a continuación
¡Feliz codificación!
fuente
En node.js también puede hacer lo siguiente:
fuente
util
se está rellenando incorrectamente. ¿Estás usando un paquete o algo así?