Angular $ promise,不使用defer

时间:2015-09-30 18:00:11

标签: javascript angularjs node.js

关于承诺的网上所有内容都表示,除了使用angular.js上的docs / examples之外,不要使用promises。

在不使用defer的情况下返回angular.js $ promise值的正确方法是什么?

这是我目前所拥有的:

function foo() {
  var deferred = $q.defer();    
  userService.findProgramsByUser({personId: personId}).$promise
    .then(function (programs) {
        deferred.resolve(programs);
    });
  return deferred.promise;
}

如果我正在使用节点Q库,我会这样做:

function foo() {
  return Q.promise(function(resolve, reject) {
    userService.findProgramsByUser({personId: personId})
      .then(function (programs) {
        resolve(programs);
      });
  }
}

如何在不使用延迟的情况下使用角度承诺做类似的事情?

2 个答案:

答案 0 :(得分:3)

由于userService.findProgramsByUser()已经有一个promise属性,只需返回

function foo() {          
  return userService.findProgramsByUser({personId: personId}).$promise
     .then(function (programs) {
          return programs;
     }, function(){
        // handle errors
     });        
}

答案 1 :(得分:1)

我真的不明白为什么使用延迟是不好的。在大多数情况下,我的服务看起来像:

var defers = {}; //somewhere in the service root.

getData: function(id){

    var defKey = 'getData' + id;

    if(defers.hasOwnProperty(defKey)) return defers[defKey].promise;

    //here is a good spot to return something from custom cache

    defers[defKey] = $q.defer();

    serverApiRequest('/api/...').then(function(response){
        defers[defKey].resolve(response.data);
        delete defers[defKey];
    });

    return defers[defKey].promise;

}

延期承诺很棒。通过这种方法,我们可以100%确定服务器只会被请求一次,并且每个并行请求都将被提供。