【问题标题】:Angular $promise without using deferAngular $promise 不使用 defer
【发布时间】:2015-09-30 18:00:11
【问题描述】:

现在网上关于 Promise 的所有内容都说在使用 Promise 时不要使用 defer,除了 angular.js 上的文档/示例。

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

这是我目前拥有的:

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

如果我使用的是 node Q 库,我会这样做:

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

如何在不使用 defer 的情况下使用 Angular Promise 做类似的事情?

【问题讨论】:

    标签: javascript angularjs node.js


    【解决方案1】:

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

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

    【讨论】:

    • 如果我想潜在地退回拒绝怎么办?
    • 可以将then 与两个回调参数一起使用,并在第一个参数中返回数据——或者在另一端处理拒绝。
    • 调用代码自己接收promise,可以直接与之交互。您最初尝试的只是将现有的 Promise 包装在新的 Promise 中。
    • 啊,我认为你是对的。不需要我把它包装起来。
    • @Catfish 查看更新,添加then ...switch to catch 如果你愿意
    【解决方案2】:

    我真的不明白为什么使用 defer 是不好的。在大多数情况下,我的服务如下所示:

    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% 确定服务器只会被请求一次,并且每个并行请求都会得到服务。

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 2015-04-01
      • 1970-01-01
      • 2016-03-03
      • 2016-02-25
      • 2017-11-23
      • 1970-01-01
      • 2019-08-03
      • 2013-11-12
      相关资源
      最近更新 更多