【问题标题】:Promise is not waiting for nest promises before resolvingPromise 在解决之前不等待嵌套承诺
【发布时间】:2017-04-02 23:09:24
【问题描述】:

我有这个初始化函数来为我的应用程序设置全局依赖关系,我正在使用 npm 包angular-global-resolve。该程序包运行良好,问题是我在初始化函数中有一个带有嵌套承诺的大承诺,并且主要承诺在嵌套承诺之前解决,这意味着某些事情在应用程序第一次运行时没有设置。我该如何解决这个问题?

我的代码:
在 routes.js 中:

  globalResolveProvider.addGlobalDependenciesTo($stateProvider, {
    getGlobalDependacies: function ($http, $rootScope, $cookies) {
      return $http.get('/__/env.json')
      .then(function(response) {
        console.log('then0')
        $rootScope.apiUrl = response.data.apiUrl;
        $rootScope.googleMapsApiKey = response.data.googleMapsApiKey;
        $rootScope.currentLocationLat = 40.7589;
        $rootScope.currentLocationLng = 73.9851;
        var hotelId = ''
        if ($cookies.get('hotel') === undefined){
          console.log('if 1')
          $http.get($rootScope.apiUrl + '/hotels')
          .then(function(dbHotels){
            console.log('then1')
            hotelId = dbHotels.data[0]._id
            $cookies.put('hotelId', hotelId)
          })
        }
        if ($cookies.get('userId') === undefined){
          console.log('if 2')
          $http.get($rootScope.apiUrl + '/users')
          .then(function(dbUsers){
            console.log('then2')
            var index = dbUsers.data.length - 1
            var userId = dbUsers.data[index]._id
            $cookies.put('userId', userId)
            $rootScope.$broadcast('update-itinerary-icon')
          })
        }
      })
      .then(function(){
        console.log("parent then is resolved")
      })
    }
  })

控制台正在记录:

then0
if 1
if 2
parent then is resolved
then1
then2

为什么父级会在then1then2 之前解决?

【问题讨论】:

    标签: javascript angularjs http promise angular-promise


    【解决方案1】:

    当你这样做时

    $http.get($rootScope.apiUrl + '/hotels')
    

    或者:

    $http.get($rootScope.apiUrl + '/users')
    

    这只是开始一个 HTTP 请求。 Flow 在父 Promise 中继续,无需等待嵌套的 GET 完成。然后父母照常解决。

    如果你想让父级等待子级promise,你必须让父级返回一个promise

    return $http.get($rootScope.apiUrl + '/hotels')
    

    现在,如果你想让父级等待多个子级promise,你必须返回一个组成多个promise的promise。将$q 注入您的函数,并将其用作您的返回语句:

    return $q.all(
        $http.get($rootScope.apiUrl + '/hotels'),
        $http.get($rootScope.apiUrl + '/users')
    );
    

    如果你想要条件逻辑,那么你可以试试这样的:

    return $q.all(
        ($cookies.get('hotel') === undefined)
        ? $http.get($rootScope.apiUrl + '/hotels')
        : $q.resolve(),
        ($cookies.get('userId') === undefined)
        ? $http.get($rootScope.apiUrl + '/users')
        : $q.resolve()
    );
    

    这使它等待一个已经完成的promise,在不需要工作的情况下。

    您也可以将您的.then() 添加到上述示例中的$http.get()

    【讨论】:

    • 我应该把 .then 放在哪里?我试过了,但似乎没有用: return $q.all( ($cookies.get('hotel') === undefined) ? $http.get($rootScope.apiUrl + '/hotels') 。 then(function(dbHotels){ console.log('then1') hotelId = dbHotels.data[0]._id $cookies.put('hotelId', hotelId) }) : $q.resolve()
    • 嗯,这确实是您应该放置.then() 的地方。我不确定为什么这对你不起作用。
    • 是的,没有任何错误,只是事情还在乱七八糟地发生。无论如何,我最终以不同的方式修复它,事实证明我实际上不需要将这两个承诺嵌套在第一个承诺中,所以我只在第一个承诺之后再做了两个 thens() 并使用了return $http.get(..)。感谢您的帮助。
    猜你喜欢
    • 2017-04-04
    • 2019-05-29
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2020-08-28
    • 2019-04-29
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多