programing

약속 체인에서의 set Timeout 사용

lastmoon 2023. 2. 26. 10:28
반응형

약속 체인에서의 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

반응형