Ici, j'essaye de faire des promesses, ici, à la première demande, je récupère un ensemble de liens, et à la demande suivante, je récupère le contenu du premier lien.Mais je veux faire un délai avant de renvoyer le prochain objet de la promesse. setTimeout dessus, mais cela me donne l'erreur JSON suivante ( without setTimeout() it works just fine
)
SyntaxError: JSON.parse: caractère inattendu à la ligne 1 colonne 1 des données JSON
je voudrais savoir pourquoi cela échoue?
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
la source
la source
return
est spécifique à la fonction et renvoie uniquement à la fonction parente, et que vous ne pouvez pas retourner à partir d'une méthode asynchrone.globalObj
.JSON.parse
jette-t-il? J'ai du mal à croire que le fait qu'il y ait un rappelsetTimeout
dans unthen
affecte l'appel dans lethen
rappel précédent .Réponses:
Pour maintenir la chaîne de promesses en cours, vous ne pouvez pas utiliser
setTimeout()
la façon dont vous l'avez fait parce que vous ne renvoyez pas une promesse du.then()
gestionnaire - vous la renvoyez à partir dusetTimeout()
rappel, ce qui ne vous sert à rien.Au lieu de cela, vous pouvez créer une simple petite fonction de retard comme celle-ci:
Et puis utilisez-le comme ceci:
Ici, vous renvoyez une promesse du
.then()
gestionnaire et elle est donc enchaînée de manière appropriée.Vous pouvez également ajouter une méthode de délai à l'objet Promise, puis utiliser directement une
.delay(x)
méthode sur vos promesses comme celle-ci:Ou utilisez la bibliothèque de promesses Bluebird qui a déjà la
.delay()
méthode intégrée.la source
delay()
renvoie une promesse qui sera résolue après lesetTimeout()
.v
est une valeur facultative avec laquelle vous souhaitez que la promesse de délai se résolve et ainsi transmette la chaîne de promesse.resolve.bind(null, v)
est à la place de l'unfunction() {resolve(v);}
ou l'autre fonctionnera.METTRE À JOUR:
quand j'ai besoin de dormir dans la fonction asynchrone, je lance
la source
La version ES6 plus courte de la réponse:
Et puis vous pouvez faire:
la source
reject
option, par exemple pour la validation eslint, alorsconst delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms))
Si vous êtes dans un bloc .then () et que vous voulez exécuter un settimeout ()
la sortie sera comme indiqué ci-dessous
Bon codage!
la source
Dans node.js, vous pouvez également effectuer les opérations suivantes:
la source
util
est polyfilled incorrectement. Utilisez-vous un bundler ou quelque chose?