#javascript #asynchronous #ecmascript-6 #async-await #promise
#язык JavaScript #асинхронный #ecmascript-6 #асинхронное ожидание #обещать
Вопрос:
Я знаю, что это распространенный задаваемый вопрос, но у меня возникла небольшая проблема, когда я пытаюсь запустить функцию ТОЛЬКО тогда, когда обещание было возвращено. Я также хочу захватить ценность, полученную от обещания.
- Поэтому я хочу получить доступ к сервису angular, который, похоже, выполняет вызов API.
- Подождите, пока обещание не разрешится.
- Затем сохраните возвращенное обещание как ценность.
- А затем запустите функцию
hello()
Кажется, когда я запускаю свой код ниже validPassengerId
и hello()
console.logs, прежде чем обещание будет выполнено.
Как мне переписать этот код, чтобы:
- Подождите, пока обещание не будет выполнено.
- Затем возьмите значение разрешенного обещания — validPassengerId. (А затем утешить.зарегистрируйте это).
- А затем запустить функцию
hello()
?function hello() { console.log("hello"); }; const promise = new Promise((resolve, reject) =gt; { let validPassengerId = _funnelBasketLuggageService.FindValidPassengerIdForBag(PassengerIds, bagsAssignedToPassengers, bag); resolve(validPassengerId); }); promise.then(validPassengerId =gt; { console.log("validPassengerId", validPassengerId); hello(); });
Комментарии:
1. Я беру на себя функцию «_funnelBasketLuggageService. FindValidPassengerIdForBag(идентификаторы пассажиров, bagsAssignedToPassengers, сумка)», является асинхронным, вы можете это подтвердить?
Ответ №1:
Предполагая FindValidPassengerIdForBag
, что обещание возвращается, вам не нужно завернуть его в другое обещание. Вы бы использовали его вот так:
_funnelBasketLuggageService .FindValidPassengerIdForBag(PassengerIds, bagsAssignedToPassengers, bag) .then(validPassengerId =gt; { console.log("validPassengerId", validPassengerId); hello(); });
Если validPassengerId
значение равно null с этим кодом, то это должно быть то, чему FindValidPassengerIdForBag
соответствует его обещание. Если вы этого не ожидали, проверьте код FindValidPassengerIdForBag
или убедитесь, что вы передаете допустимые параметры.
Комментарии:
1. Большое вам спасибо, Николас! Вы правы,
validPassengerId
на самом деле возвращалось значение null, и я не понимал, что это правильное значение. Тем не менее, я думаю, что ваш код работает хорошо, потому что, как вы сказали, приятно знать, что мне не нужно заключатьFindValidPassengerIdForBag
в другое обещание. Я хорошо прочитаю это, чтобы понять это, спасибо!
Ответ №2:
Если на самом деле _funnelBasketLuggageService.FindValidPassengerIdForBag
возвращает обещание, вы решите эту проблему, не создавая свое собственное Promise
:
function hello() { console.log("hello"); }; const promise = _funnelBasketLuggageService.FindValidPassengerIdForBag(PassengerIds, bagsAssignedToPassengers, bag); promise.then(validPassengerId =gt; { console.log("validPassengerId", validPassengerId); hello(); });
Объяснение Того, что вы сделали, на самом деле заключало Promise
возвращенное FindValidPassengerIdForBag
вами в другое Promise
, которое возвращается немедленно.
Если вам абсолютно необходимо завернуть его в свой собственный Promise
, например, потому что вам нужно выполнить некоторую предварительную обработку, используйте .then
вместо возвращаемого значения функции:
function hello() { console.log("hello"); }; const promise = new Promise((resolve, reject) =gt; {_funnelBasketLuggageService.FindValidPassengerIdForBag(PassengerIds, bagsAssignedToPassengers, bag).then(id=gt;resolve(id)); }); promise.then(validPassengerId =gt; { console.log("validPassengerId", validPassengerId); hello(); });
Комментарии:
1. Привет @Taxel — большое вам спасибо за ваше решение. Я поиграю с этим и посмотрю, смогу ли я заставить его работать..
FindValidPassengerIdForBag
фактически возвращаетnull
, но также включает обещание в эту функцию. Позвольте мне поиграть с этим и обдумать ваше объяснение. Спасибо!