我陷入了一个小困境。在这个angularJs应用程序(1.3.7v)中,我从服务器获取需求以及用户所有物,并执行一些前端验证。看起来像这样:
validationFunction = function(userId){
return new Promise(function(resolve, reject){
Promise.all([
requirementService.requirementApi.requirements.getAll().$promise,
userBelongingsService.userBelongingsApi.getAll(userId).$promise
]).then(function(requirements,belongings){
console.log(requirements, belongings);
resolve(isValid(requirements, belongings));
}).catch(function (err) {
reject(err);
});
});
}
作为参考,我也试过
validationFunction = function(userId){
return new Promise(function(resolve, reject){
requirementService.requirementApi.requirements.getAll().$promise.then(function(requirements) {
return [requirements, userBelongingsService.userBelongingsApi.getAll(userId)];
}).then(function(requirements,belongings){
console.log(requirements, belongings);
resolve(isValid(requirements, belongings));
}).catch(function (err) {
reject(err);
});
});
}
承诺是异步的,因此它们只会在以后得到解决。但如果与.then()一起使用,它应该等到它们被解决(拒绝或解决)。虽然在这两种方法中,承诺在它们被传递给它们不是的函数时被解决(在某个时间)。所以函数失败说它们是未定义的。那么另一种方式是什么,或者我错过了什么? :)
答案 0 :(得分:1)
您的代码可以简化为
validationFunction = function(userId){
return Promise.all([
requirementService.requirementApi.requirements.getAll().$promise,
userBelongingsService.userBelongingsApi.getAll(userId).$promise
]).then(function([requirements,belongings]){
console.log(requirements, belongings);
return isValid(requirements, belongings);
});
};
但是,它包含一些es2015 +细节
所以,在不那么现代的JS中
validationFunction = function(userId){
return Promise.all([
requirementService.requirementApi.requirements.getAll().$promise,
userBelongingsService.userBelongingsApi.getAll(userId).$promise
]).then(function(results){
console.log(results[0], results[1]);
return isValid(results[0], results[1]);
});
};
编辑:对不起,我在上面的代码中错过了a)
稍微扩展答案(与现实世界分心) - 首先,正如@Bergi指出的那样,避免Promise constructor antipattern! - 当您处理返回承诺的函数(Promise.all
,....getAll().$promise
,....getAll(userId).$promise
)时,无需将所有内容包含在new Promise
其次,使用单个参数(已解析的值)调用.then
的onfulfilled回调。在Promise.all
的情况下,这是一个resovled值的数组,其顺序与它们在Promise.all
参数中出现的顺序相同。这就是为什么ES2015 +版本可以使用([a,b])形式的函数参数(抱歉,我无法回想起或找到" name"这个表单)。重要的是要注意,如果Promise.all数组中的任何一个Promise被拒绝,Promise.all拒绝接受(第一个)被拒绝的承诺的拒绝价值(那很多被拒绝的承诺)句子!)
您还可以删除代码的.catch部分,因为错误处理可以(并且应该)通过函数的调用代码来完成
validationFunction(someUserId)
.then(function(result) {
// this will be the value of isValid(requirements, belongings)
})
.catch(function(err) {
// do some error handling here
});
最后,以其最ES2015 +形式(我能想到的)
validationFunction = userId => Promise.all([
requirementService.requirementApi.requirements.getAll().$promise,
userBelongingsService.userBelongingsApi.getAll(userId).$promise
]).then(([requirements, belongings]) => isValid(requirements, belongings));