如何从ajax承诺中返回一个值

时间:2016-07-27 17:24:06

标签: angularjs angular-promise

我在angular 1.5控制器中有一个方法,如下图所示,但是我想将ajax调用重构到工厂本身,但我遇到了承诺问题..我正试图找到我的角色控制器我可以像下面显示的那样调用方法。这可能吗?我试图避免成功(控制器代码中的函数(...)。

任何帮助都非常感激。

尝试转移到

vm.member = someFactory.getMember(vm.id);

现有工作控制器代码

vm.myMethod = myMethod;
...

function myMethod() {
    someFactory.getMember(vm.id).success(function(response) {
      vm.member = response;
    });
}

当我将getMethod行移动到工厂时,响应会明显填充,但是一旦我回到控制器,即使工厂的返回值是响应,结果也是未定义的。我知道这是因为承诺,但有一种我缺少的设计模式或干净的方式。使用我当前的方法,我的控制器充斥着.success(function()...)

非常感谢!

1 个答案:

答案 0 :(得分:0)

该程序称为承诺展开。

除了success已被弃用且应替换为then的事实,

someFactory.getMember(vm.id).then(function(response) {
  var data = res.data;
  ...
});

在控制器中安装它是完全可以的。

此模式的替代方法是返回自填充对象(ngResource $resource所做的事情):

function getMember(...) {
  var data = {};
  $http(...).then(function (response) {
    // considering that response data is JSON object,
    // it can replace existing data object
    angular.copy(data, response.data);
  });
  return data;
}

在这种情况下,控制器可以立即获得对象的引用,对象属性{{ vm.member.someProperty }}的绑定将在响应时更新。

模式仅限于对象(和数组),标量值应该用对象包装。