【问题标题】:How to grab value of promise and fire function如何获取promise和fire函数的值
【发布时间】:2021-12-07 00:54:40
【问题描述】:

我知道这是一个常见的问题,但我遇到了一些问题,试图触发一个函数,只有当一个承诺被返回时。我也想获取 promise 返回的值。

  • 所以我想访问一个 Angular 服务,它似乎在进行 API 调用。
  • 等待承诺解决。
  • 然后将返回的承诺存储为值。
  • 然后触发函数hello()

似乎当我在承诺解决之前运行下面的代码validPassengerIdhello()console.logs。

如何将这段代码重写为:

  • 等待承诺解决。

  • 然后获取已解决的承诺的值 - validPassengerId。 (然后 console.log 它)。

  • 然后触发函数hello()?

      function hello() {
          console.log("hello");
      };
    
      const promise = new Promise((resolve, reject) => {
          let validPassengerId = _funnelBasketLuggageService.FindValidPassengerIdForBag(PassengerIds, bagsAssignedToPassengers, bag);
         resolve(validPassengerId);
      });
    
      promise.then(validPassengerId => {
          console.log("validPassengerId", validPassengerId);
          hello();
      });
    

【问题讨论】:

  • 我假设函数“_funnelBasketLuggageService.FindValidPassengerIdForBag(PassengerIds, bagAssignedToPassengers, bag)”是异步的,你能验证一下吗?

标签: javascript asynchronous ecmascript-6 async-await promise


【解决方案1】:

假设FindValidPassengerIdForBag 返回一个promise,你不需要将它包装在另一个promise 中。你可以这样使用它:

_funnelBasketLuggageService
  .FindValidPassengerIdForBag(PassengerIds, bagsAssignedToPassengers, bag)
  .then(validPassengerId => {
    console.log("validPassengerId", validPassengerId);
    hello();
  });

如果 validPassengerId 在这段代码中为空,那么这一定是 FindValidPassengerIdForBag 正在解决它的承诺。如果您没有预料到,请检查FindValidPassengerIdForBag 的代码或检查您传递的参数是否有效。

【讨论】:

  • 非常感谢尼古拉斯!你是对的,validPassengerId 实际上返回 null 而我没有意识到这是正确的值。但是,我认为您的代码运行良好,因为正如您所说,很高兴知道,我不需要将 FindValidPassengerIdForBag 包装在另一个承诺中。我会好好阅读这篇文章来理解这一点,谢谢!
【解决方案2】:

如果实际上_funnelBasketLuggageService.FindValidPassengerIdForBag 返回了一个承诺,那么您无需创建自己的Promise 即可解决此问题:

 function hello() {
      console.log("hello");
  };

  const promise = _funnelBasketLuggageService.FindValidPassengerIdForBag(PassengerIds, bagsAssignedToPassengers, bag);

  promise.then(validPassengerId => {
      console.log("validPassengerId", validPassengerId);
      hello();
  });

解释你所做的实际上是将FindValidPassengerIdForBag返回的Promise包装在另一个立即返回的Promise中。

如果您绝对必须将其包装在您自己的 Promise 中,例如因为需要做一些预处理,所以用.then代替函数的返回值:

  function hello() {
      console.log("hello");
  };

  const promise = new Promise((resolve, reject) => {_funnelBasketLuggageService.FindValidPassengerIdForBag(PassengerIds, bagsAssignedToPassengers, bag).then(id=>resolve(id));
  });

  promise.then(validPassengerId => {
      console.log("validPassengerId", validPassengerId);
      hello();
  });

【讨论】:

  • 嗨@Taxel-非常感谢您的解决方案。我会玩这个,看看我能不能让它工作。FindValidPassengerIdForBag 实际上返回null,但在这个函数中也包含一个承诺。让我玩弄它并围绕你的解释。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多