약속 체인에서 setTimeout 사용
여기서 나는 약속에 대해 머리를 감싸려고 노력하고 있습니다. 첫 번째 요청에서 링크 세트를 가져오고 다음 요청에서 첫 번째 링크의 내용을 가져옵니다.하지만 다음 약속 객체를 반환하기 전에 지연을 만들고 싶습니다. 그래서 사용합니다. 그것에 setTimeout. 그러나 그것은 나에게 다음과 같은 JSON 오류를 제공합니다 ( without setTimeout() it works just fine
)
SyntaxError : JSON.parse : JSON 데이터의 1 행 1 열에 예기치 않은 문자가 있습니다.
왜 실패했는지 알고 싶습니다.
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);
});
약속 체인을 계속 유지하려면 핸들러 setTimeout()
에서 약속을 반환하지 않기 때문에했던 방식을 사용할 수 없습니다 .then()
. setTimeout()
콜백 에서 반환하므로 좋지 않습니다.
대신 다음과 같이 간단한 지연 함수를 만들 수 있습니다.
function delay(t, v) {
return new Promise(function(resolve) {
setTimeout(resolve.bind(null, v), t)
});
}
그리고 다음과 같이 사용하십시오.
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);
// return a promise here that will be chained to prior promise
return delay(1000).then(function() {
return getLinks(globalObj["two"]+".txt");
});
});
Here you're returning a promise from the .then()
handler and thus it is chained appropriately.
You can also add a delay method to the Promise object and then directly use a .delay(x)
method on your promises like this:
function delay(t, v) {
return new Promise(function(resolve) {
setTimeout(resolve.bind(null, v), t)
});
}
Promise.prototype.delay = function(t) {
return this.then(function(v) {
return delay(t, v);
});
}
Promise.resolve("hello").delay(500).then(function(v) {
console.log(v);
});
Or, use the Bluebird promise library which already has the .delay()
method built-in.
.then(() => new Promise((resolve) => setTimeout(resolve, 15000)))
The shorter ES6 version of the answer:
const delay = t => new Promise(resolve => setTimeout(resolve, t));
And then you can do:
delay(3000).then(() => console.log('Hello'));
If you are inside a .then() block and you want to execute a settimeout()
.then(() => {
console.log('wait for 10 seconds . . . . ');
return new Promise(function(resolve, reject) {
setTimeout(() => {
console.log('10 seconds Timer expired!!!');
resolve();
}, 10000)
});
})
.then(() => {
console.log('promise resolved!!!');
})
output will as shown below
wait for 10 seconds . . . .
10 seconds Timer expired!!!
promise resolved!!!
Happy Coding!
참고URL : https://stackoverflow.com/questions/39538473/using-settimeout-on-promise-chain
'developer tip' 카테고리의 다른 글
Node.js의 JSON 객체로 응답 (객체 / 배열을 JSON 문자열로 변환) (0) | 2020.09.02 |
---|---|
Laravel Homestead 사용 : '지정된 입력 파일 없음' (0) | 2020.09.02 |
Chrome 확장 프로그램 첫 실행 / 업데이트 감지 (0) | 2020.09.02 |
Phonegap이있는 iOS 7 상태 표시 줄 (0) | 2020.09.02 |
react-router 페이지로 돌아 가기 히스토리를 어떻게 구성합니까? (0) | 2020.09.02 |