Как захватить ценность обещания и функцию огня

#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 , но также включает обещание в эту функцию. Позвольте мне поиграть с этим и обдумать ваше объяснение. Спасибо!