Hier versuche ich, meinen Kopf um Versprechen zu wickeln. Hier hole ich auf erste Anfrage eine Reihe von Links. Und auf nächste Anfrage hole ich den Inhalt des ersten Links. Aber ich möchte eine Verzögerung machen, bevor ich das nächste Versprechen zurückschicke. Also benutze ich setTimeout drauf. Aber es gibt mir den folgenden JSON-Fehler ( without setTimeout() it works just fine
)
SyntaxError: JSON.parse: Unerwartetes Zeichen in Zeile 1, Spalte 1 der JSON-Daten
Ich würde gerne wissen, warum es fehlschlägt.
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
quelle
quelle
return
funktionsspezifisch ist und nur zur übergeordneten Funktion zurückkehrt und dass Sie nicht von einer asynchronen Methode zurückkehren können.globalObj
.JSON.parse
wirft? Es fällt mir schwer zu glauben, dass die Frage, obsetTimeout
einthen
Rückruf vorliegt, den Anruf im vorherigenthen
Rückruf beeinflusst.Antworten:
Um die Versprechenskette am Laufen zu halten, können Sie nicht so vorgehen,
setTimeout()
wie Sie es getan haben, weil Sie kein Versprechen vom.then()
Handler zurückgeben - Sie geben es vomsetTimeout()
Rückruf zurück, was Ihnen nicht gut tut.Stattdessen können Sie eine einfache kleine Verzögerungsfunktion wie folgt erstellen:
Und dann benutze es so:
Hier geben Sie ein Versprechen vom
.then()
Handler zurück und es ist entsprechend verkettet.Sie können dem Promise-Objekt auch eine Verzögerungsmethode hinzufügen und dann direkt eine
.delay(x)
Methode für Ihre Versprechen verwenden:Oder verwenden Sie die Bluebird-Versprechensbibliothek, in die die
.delay()
Methode bereits integriert ist .quelle
delay()
gibt ein Versprechen zurück, das nach dem gelöst wirdsetTimeout()
.v
ist ein optionaler Wert, mit dem das Verzögerungsversprechen aufgelöst und damit die Versprechenskette weitergegeben werden soll.resolve.bind(null, v)
ist anstelle vonfunction() {resolve(v);}
Entweder wird funktionieren.AKTUALISIEREN:
Wenn ich in einer asynchronen Funktion schlafen muss, werfe ich ein
quelle
Die kürzere ES6-Version der Antwort:
Und dann können Sie tun:
quelle
reject
Option benötigen , z. B. für die Eslint-Validierung, dannconst delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms))
Wenn Sie sich in einem .then () -Block befinden und ein Settimeout () ausführen möchten
Die Ausgabe erfolgt wie unten gezeigt
Viel Spaß beim Codieren!
quelle
In node.js können Sie auch Folgendes tun:
quelle
util
dass er falsch ausgefüllt wird. Verwenden Sie einen Bundler oder so?