Tutaj próbuję zawinąć głowę wokół obietnic, tutaj na pierwsze żądanie pobieram zestaw linków, a na następne żądanie pobieram zawartość pierwszego linku, ale chcę zrobić opóźnienie przed zwróceniem następnego obiektu obietnicy. setTimeout on it.Ale daje mi następujący błąd JSON ( without setTimeout() it works just fine
)
Błąd składni: JSON.parse: nieoczekiwany znak w wierszu 1 kolumny 1 danych JSON
chciałbym wiedzieć, dlaczego się nie udaje?
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
źródło
źródło
return
jest to specyficzne dla funkcji i wraca tylko do funkcji nadrzędnej i że nie możesz powrócić z metody asynchronicznej.globalObj
.JSON.parse
rzuca? Trudno mi uwierzyć, że to, czy istniejesetTimeout
w jednymthen
wywołaniu zwrotnym, wpływa na połączenie w poprzednimthen
wywołaniu zwrotnym.Odpowiedzi:
Aby utrzymać łańcuch obietnic, nie możesz użyć
setTimeout()
tego, co zrobiłeś, ponieważ nie zwracasz obietnicy od.then()
obsługi - zwracasz ją zsetTimeout()
wywołania zwrotnego, co nie przynosi ci korzyści.Zamiast tego możesz wykonać prostą funkcję opóźnienia, taką jak ta:
A następnie użyj tego w ten sposób:
Tutaj zwracasz obietnicę od przewodnika
.then()
i dlatego jest ona odpowiednio powiązana.Możesz również dodać metodę opóźnienia do obiektu Promise, a następnie bezpośrednio użyć
.delay(x)
metody do swoich obietnic, takiej jak ta:Lub użyj biblioteki obietnic Bluebird, która ma już
.delay()
wbudowaną metodę.źródło
delay()
zwraca obietnicę, która zostanie rozwiązana posetTimeout()
.v
to opcjonalna wartość, z którą chcesz, aby obietnica opóźnienia została rozwiązana, a tym samym przekazała łańcuch obietnic.resolve.bind(null, v)
jest na miejscufunction() {resolve(v);}
Albo będzie działać.AKTUALIZACJA:
kiedy potrzebuję spać w funkcji asynchronicznej, wrzucam
źródło
Krótsza wersja ES6 odpowiedzi:
A potem możesz:
źródło
reject
opcji, np. do walidacji eslint, toconst delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms))
Jeśli jesteś wewnątrz bloku .then () i chcesz wykonać settimeout ()
wyjście będzie, jak pokazano poniżej
Miłego kodowania!
źródło
W node.js możesz również wykonać następujące czynności:
źródło
util
jest on nieprawidłowo wypełniany. Używasz pakietu czy czegoś takiego?