gpt4 book ai didi

javascript - Promise 在解决之前不等待嵌套 promise

转载 作者:可可西里 更新时间:2023-11-01 17:00:26 24 4
gpt4 key购买 nike

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

我的代码:
在 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 之前解析?

最佳答案

当你这样做的时候

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

或者:

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

这只会开始一个 HTTP 请求。流程在父 promise 中继续,无需等待嵌套的 GET 完成。然后 parent 照常解决。

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

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

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

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()

关于javascript - Promise 在解决之前不等待嵌套 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40688266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com