2014-10-02 67 views
0

在Angular(以及其他JavaScript框架)中,来自http请求的数据使用promise进行异步检索,并且可以使用回调将其设置为变量。够简单。但我越来越厌倦了编写代码,看起来像这样:使用promise和避免回调的异步设置变量

service.getWidgetsAsync(function (result) { vm.widgets = result.data }); 

有没有,我没有想到的,更类似于这样写上面的任何方式....?

vm.widgets = service.getWidgetsAsync(); 

“不”可能是一个有效的答案。 :-)

(实施例的getWidgetsAsync加入到澄清:)

function getWidgetsAsync(callback) { 
    $http.get(APPBASEURL + 'Foo/GetWidgets') 
     .then(function(result) { 
      callback(result); 
     }); 
} 
+1

我的例子中没有看到任何承诺。回调函数基本上是一个承诺的对立面。 – JLRishe 2014-10-02 18:02:29

+0

我的理解是'getWidgetsAsync'是承诺,并将回调传递给它。 – RJB 2014-10-02 18:03:09

+1

您是否将“承诺”与“异步功能”相混淆?承诺有一个'.then()'方法。你不直接称他们为功能。你可以命名一个你使用的实际API而不是像“getWidgetsAsync”这样的假名吗?然后我们可以找出它是否与承诺有关。 – JLRishe 2014-10-02 18:05:27

回答

2

的问题是,你是通过涉及回调击败承诺的整点。返回,而不是用它来调用回调的承诺:

function getWidgetsAsync() { 
    return $http.get(APPBASEURL + 'Foo/GetWidgets'); 
} 

然后,你可以这样写代码:

service.getWidgetsAsync() 
.then(function (result) { 
    vm.widgets = result.data; 
    // do more stuff with vm.widgets 
}) 
.then(/* do other things after the function above is done */); 

回答你的问题是,不,你不能使用的结果在您调用它之后立即执行异步操作。如果可以的话,它不会是异步的。

+0

不知道为什么我没有想到返回/揭示$ http.get的承诺....这是有帮助的,谢谢! – RJB 2014-10-02 18:14:30

1

是且不是......您可以使用角度为$resource,它将最初用变量对象填充变量,并在获取结果时填写详细信息,以便您的代码看起来像您想要的那样,但值不是直到通话完成,所以你不能立即假定你有数据。

angular.module('MyApp') 
    .factory('WidgetResource', ['$resource', function ($resource) { 
     return $resource('/api/widgets', 
      { 
      'get': {method:'GET'}, 
      'save': {method:'POST'}, 
      'query': {method:'GET', isArray:true}, 
      'remove': {method:'DELETE'}, 
      'delete': {method:'DELETE'} 
      }); 
    }]); 

然后在你的控制器:

var vm.widgets = WidgetResource.query(); 

任何绑定或手表,你要做的就是接收到数据时,将触发。例如,如果您有一个ng-repeat中的小部件列表,它们将在ajax调用完成时显示,但如果您在代码中上面的行之后立即检查小部件数组的长度,它将为零。