약속 체인에서의 set Timeout 사용
여기서 나는 약속에 대해 머리를 싸매려고 한다.첫 번째 요청에서는 링크 세트를 가져오고 다음 요청에서는 첫 번째 링크의 콘텐츠를 가져옵니다.하지만 다음 약속 오브젝트를 반환하기 전에 지연시키고 싶습니다.그래서 set Timeout을 사용합니다.단, 다음과 같은 JSON 에러()without setTimeout() it works just fine
가 표시됩니다.
SyntaxError: JSON.parse: JSON 데이터의 행 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(resolve => setTimeout(resolve, t, v));
}
그리고 이렇게 쓰세요.
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");
});
});
여기 당신은 당신의 약속에 대한 답신입니다..then()
핸들러에 의해 적절히 체인이 됩니다.
Promise 객체에 지연 메서드를 추가한 후 직접 사용할 수도 있습니다..delay(x)
다음과 같은 방법으로 약속을 이행합니다.
function delay(t, v) {
return new Promise(resolve => setTimeout(resolve, t, v));
}
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);
});
.then(() => new Promise((resolve) => setTimeout(resolve, 15000)))
갱신:
비동기 기능으로 수면이 필요할 때 투입합니다.
await new Promise(resolve => setTimeout(resolve, 1000))
답변의 짧은 ES6 버전:
const delay = t => new Promise(resolve => setTimeout(resolve, t));
다음으로 다음 작업을 수행할 수 있습니다.
delay(3000).then(() => console.log('Hello'));
.then() 블록 내에 있으며 setimeout()을 실행하는 경우
.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!!!');
})
출력은 다음과 같습니다.
wait for 10 seconds . . . .
10 seconds Timer expired!!!
promise resolved!!!
해피 코딩!
노드 v15부터 타이머 약속 API를 사용할 수 있습니다.
문서의 예:
import { setTimeout } from 'timers/promises'
const res = await setTimeout(100, 'result')
console.log(res) // Prints 'result'
node.js에서는 다음 작업도 수행할 수 있습니다.
const { promisify } = require('util')
const delay = promisify(setTimeout)
delay(1000).then(() => console.log('hello'))
현재의 LTS에서는 더 쉽고 비동기/대기 기능을 사용하여 타임아웃을 처리할 수 있습니다.현재는 타임아웃을 사용하는 것이 권장되고 있습니다.
그렇다면, 추천할 만한 방법은 아닙니다.
const { promisify } = require('util')
const sleep = promisify(setTimeout)
async function myFunction() {
await sleep(1e3)
console.log('This will be seen after 1 sec')
await sleep(5e3)
console.log('This will be seen after 5 sec after')
}
const myStuff = new Promise(function (resolve) {
console.log("before timeout");
setTimeout(
function (x) {
console.log("inside the timeout");
resolve(x);
},
3000,
"after timeout"
);
}).then((response) => console.log(response));
언급URL : https://stackoverflow.com/questions/39538473/using-settimeout-on-promise-chain
'programing' 카테고리의 다른 글
Wordpress 로그인 이름으로 사용자 ID 가져오기 (0) | 2023.03.08 |
---|---|
LogBack을 사용한 SpringBoot에서 LOG_PATH_IS_UNDEFINED 폴더 생성 (0) | 2023.02.26 |
ASP.NET MVC 3 (레이저) 에이잭스Action Link - 내가 뭘 잘못하고 있지? (0) | 2023.02.26 |
MySQL(5.6) 열에 json 문서가 문자열로 포함된 경우 값을 가져오는 방법 (0) | 2023.02.26 |
react use객체 비교 효과 (0) | 2023.02.26 |