无法通过嵌套承诺获得 $q.all - 等待所有
Cannot get $q.all with nested promises working - wait for all
我完全理解以前有人问过类似的问题,但我不明白运行。我需要一连串的承诺,我需要等到所有承诺都得到解决。
我的问题是我需要根据另一个承诺的结果调用不同的承诺:-(
所以根据 promise2 我的 promise4 的结果是 EITHER $translate.use 或是$translate.refresh。
这是我目前所拥有的(已简化):
var promise1 = someService.get({}).$promise.then(function (result) {
// do stuff
});
var promise2 = anotherService.getPromise().then(function (result) {
var properties = result[0];
// do stuff
return properties;
});
var promise3 = promise2.then(function(properties){
// using $translate (angular-translate) here which is async as well
var userLanguage = properties.language;
if (userLanguage !== $translate.preferredLanguage()) {
// either this is the 4th promise
$translate.use(userLanguage).then(function (myVar) {
// ...
});
} else {
// or this is the 4th promise
$translate.refresh().then(function (myVar) {
// ...
});
}
});
var loadPromises = {
promise1: promise1
promise2: promise2
promise3: promise3
promise4: ???
};
$q.all(loadPromises).then(function (result) {
// anything done
});
你不需要监控promise3
和promise4
,你只需要监控promise1
和promise2
。 promise3
成为 promise2
的下一步。请注意您如何从 promise2
然后 return 新承诺(return $translate.use
或 return $translate.refresh
)然后部分 :
var promise1 = someService.get({}).$promise.then(function(result) {
// do stuff
});
var promise2 = anotherService.getPromise().then(function(result) {
var properties = result[0];
// do stuff
return properties;
})
.then(function(properties) {
// using $translate (angular-translate) here which is async as well
var userLanguage = properties.language;
if (userLanguage !== $translate.preferredLanguage()) {
// either this is the 4th promise
return $translate.use(userLanguage).then(function(myVar) {
// ...
});
} else {
// or this is the 4th promise
return $translate.refresh().then(function(myVar) {
// ...
});
}
});
var loadPromises = {
promise1: promise1,
promise2: promise2
};
$q.all(loadPromises).then(function(result) {
// anything done
});
如果我足够理解你的代码,我认为你只需要 return promise3
里面的 inner promise。在您的示例中, promise1
和 promise2
在服务完成之前不会被解析。由于 promise3
依赖于 promise2
它不会完成直到 promise2
解决。我相信 $q.all
会一直持续下去,直到所有承诺都完成,甚至 return 由承诺完成。由于 promise3
return 是一个承诺,在解决内部承诺之前,promise3
不会被视为已解决。所以,我认为只需添加几个 return
语句即可:
var promise1 = someService.get({}).$promise.then(function (result) {
// do stuff
});
var promise2 = anotherService.getPromise().then(function (result) {
var properties = result[0];
// do stuff
return properties;
});
var promise3 = promise2.then(function(properties){
// using $translate (angular-translate) here which is async as well
var userLanguage = properties.language;
if (userLanguage !== $translate.preferredLanguage()) {
// either this is the 4th promise
//NOTE: added return here
return $translate.use(userLanguage).then(function (myVar) {
// ...
});
} else {
// or this is the 4th promise
//NOTE: added return here
return $translate.refresh().then(function (myVar) {
// ...
});
}
});
var loadPromises = {
promise1: promise1,
promise2: promise2,
promise3: promise3
};
$q.all(loadPromises).then(function (result) {
// anything done
});
我完全理解以前有人问过类似的问题,但我不明白运行。我需要一连串的承诺,我需要等到所有承诺都得到解决。
我的问题是我需要根据另一个承诺的结果调用不同的承诺:-(
所以根据 promise2 我的 promise4 的结果是 EITHER $translate.use 或是$translate.refresh。
这是我目前所拥有的(已简化):
var promise1 = someService.get({}).$promise.then(function (result) {
// do stuff
});
var promise2 = anotherService.getPromise().then(function (result) {
var properties = result[0];
// do stuff
return properties;
});
var promise3 = promise2.then(function(properties){
// using $translate (angular-translate) here which is async as well
var userLanguage = properties.language;
if (userLanguage !== $translate.preferredLanguage()) {
// either this is the 4th promise
$translate.use(userLanguage).then(function (myVar) {
// ...
});
} else {
// or this is the 4th promise
$translate.refresh().then(function (myVar) {
// ...
});
}
});
var loadPromises = {
promise1: promise1
promise2: promise2
promise3: promise3
promise4: ???
};
$q.all(loadPromises).then(function (result) {
// anything done
});
你不需要监控promise3
和promise4
,你只需要监控promise1
和promise2
。 promise3
成为 promise2
的下一步。请注意您如何从 promise2
然后 return 新承诺(return $translate.use
或 return $translate.refresh
)然后部分 :
var promise1 = someService.get({}).$promise.then(function(result) {
// do stuff
});
var promise2 = anotherService.getPromise().then(function(result) {
var properties = result[0];
// do stuff
return properties;
})
.then(function(properties) {
// using $translate (angular-translate) here which is async as well
var userLanguage = properties.language;
if (userLanguage !== $translate.preferredLanguage()) {
// either this is the 4th promise
return $translate.use(userLanguage).then(function(myVar) {
// ...
});
} else {
// or this is the 4th promise
return $translate.refresh().then(function(myVar) {
// ...
});
}
});
var loadPromises = {
promise1: promise1,
promise2: promise2
};
$q.all(loadPromises).then(function(result) {
// anything done
});
如果我足够理解你的代码,我认为你只需要 return promise3
里面的 inner promise。在您的示例中, promise1
和 promise2
在服务完成之前不会被解析。由于 promise3
依赖于 promise2
它不会完成直到 promise2
解决。我相信 $q.all
会一直持续下去,直到所有承诺都完成,甚至 return 由承诺完成。由于 promise3
return 是一个承诺,在解决内部承诺之前,promise3
不会被视为已解决。所以,我认为只需添加几个 return
语句即可:
var promise1 = someService.get({}).$promise.then(function (result) {
// do stuff
});
var promise2 = anotherService.getPromise().then(function (result) {
var properties = result[0];
// do stuff
return properties;
});
var promise3 = promise2.then(function(properties){
// using $translate (angular-translate) here which is async as well
var userLanguage = properties.language;
if (userLanguage !== $translate.preferredLanguage()) {
// either this is the 4th promise
//NOTE: added return here
return $translate.use(userLanguage).then(function (myVar) {
// ...
});
} else {
// or this is the 4th promise
//NOTE: added return here
return $translate.refresh().then(function (myVar) {
// ...
});
}
});
var loadPromises = {
promise1: promise1,
promise2: promise2,
promise3: promise3
};
$q.all(loadPromises).then(function (result) {
// anything done
});