#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?
});
Для получения дополнительной информации см.