Как установить тайм-аут в Promise.race()?

#angularjs #promise #es6-promise #angular-promise #race-condition

#angularjs #обещание #es6-обещание #angular-обещание #race-условие

Вопрос:

Я пытаюсь использовать функцию promise.race в моем компоненте angular, и у меня возникают проблемы с таймаутом. Несмотря на то, что я определил свой тайм-аут равным 1 секунде внутри promise.race, ответ ожидает выполнения в течение 15 секунд? Вот мой код:

 let statusFind = this.getStatus(); //This takes 15 seconds
let statusTimeout = new Promise((resolve, reject) => { // This resolved in 1 second
    let wait = setTimeout(() => {
      clearTimeout(wait);
      let status = {connection : 0 , online : -3,  isPrintable : false };
      resolve (status);
    }, 1000)
});
      
Promise.race([ statusFind, statusTimeout]).then((statusResponse: any) => {
// Here I am getting my status response back in 15 second even if my timeout promise gets resolved first. 
//Though I am getting the value here as my timeout value but why it is waiting for my 15 second first promise to finish?

});
  

Пожалуйста, помогите.

Ответ №1:

AngularJS изменяет обычный поток JavaScript, предоставляя собственный цикл обработки событий. Это разделяет JavaScript на классический контекст выполнения и AngularJS. Только операции, которые применяются в контексте выполнения AngularJS, выиграют от привязки данных AngularJS, обработки исключений, просмотра свойств и т.д.

Обещания ES6 не интегрированы с платформой AngularJS и ее циклом дайджеста.

Вместо этого используйте обещания, созданные службой AngularJS $q :

 ̶P̶r̶o̶m̶i̶s̶e̶.̶r̶a̶c̶e̶(̶[̶ ̶s̶t̶a̶t̶u̶s̶F̶i̶n̶d̶,̶ ̶s̶t̶a̶t̶u̶s̶T̶i̶m̶e̶o̶u̶t̶]̶)̶.̶t̶h̶e̶n̶(̶(̶s̶t̶a̶t̶u̶s̶R̶e̶s̶p̶o̶n̶s̶e̶:̶ ̶a̶n̶y̶)̶ ̶=̶>̶ ̶{̶
$q.race([ statusFind, statusTimeout]).then((statusResponse: any) => {

    // Here I am getting my status response back in 15 second even if my timeout promise gets resolved first. 
    //Though I am getting the value here as my timeout value but why it is waiting for my 15 second first promise to finish?

});
  

Для получения дополнительной информации см.