Неоднозначное поведение setTimeout при использовании с обещаниями - PullRequest
0 голосов
/ 11 декабря 2018

Я хотел запускать асинхронный метод внутри обещания каждые x секунд, пока не будет выполнено определенное условие, а затем вызвать resolve() для разрешения обещания.Я попробовал это, используя два подхода (показано ниже).Второй подход разработан с использованием IIFE и дает правильные результаты, но в первом подходе метод setTimeout выполняется только один раз, но в соответствии с определением.из setTimeout он должен выполнять обратный вызов в течение неопределенного периода времени в течение указанного промежутка времени, пока не будет вызван clearTimeout().Может кто-нибудь объяснить мне, почему я не получаю желаемый результат при первом подходе?

Подход 1

function func2() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {

            client.get('statuses/user_timeline', params1).then((response) => {
                //    some code
                //    some code

                if (condition is met) {
                    return resolve()
                } else {
                    //    some code
                }
            })
        }, 1000)
    })
}

Подход 2

function func2 () {
    return new Promise((resolve, reject) => {
        (function func1() {
            client.get('statuses/user_timeline', params1).then((response) => {
                //    some code
                if (condition is met) {
                    return resolve()
                } else {
                    //    some code
                    setTimeout(func1, 1000)
                }
            })
        })()
    }
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете достичь этого с помощью рекурсивных функций

function waitForTimeline() {
   return client
       .get('statuses/user_timeline', params1)
       .then((response) => {
           if (condition is met) { return response }
           // In case the condition was not met, just call the same function
           // after a second
           return new Promise( ( resolve, reject ) => {
               setTimeout( () => {
                  waitForTimeline()
                      .then( resolve )
                      .catch( reject )
               }, 1000 );
           } );     
       }
};
0 голосов
/ 11 декабря 2018

setTimeout() выполняет функцию только один раз, я думаю, что вы ищете setInterval().Работает так же, но при выполнении функции бесконечно вызывается единица clearInterval().

Это будет ваша функция:

function func2() {
return new Promise((resolve, reject) => {
  let interval = setInterval(() => {

  client.get('statuses/user_timeline', params1).then((response) => {
    //    some code
    //    some code

    if (condition is met) {
      clearInterval(interval)
      return resolve()
  } else {
    //    some code
  }
})
}, 1000)
})
}
...