AngularJs将promise响应作为函数

时间:2016-09-26 10:14:34

标签: javascript angularjs promise

我陷入了一个小困境。在这个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()一起使用,它应该等到它们被解决(拒绝或解决)。虽然在这两种方法中,承诺在它们被传递给它们不是的函数时被解决(在某个时间)。所以函数失败说它们是未定义的。那么另一种方式是什么,或者我错过了什么? :)

1 个答案:

答案 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));