在Angular(和其他JavaScript框架)中,来自http请求的数据使用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);
});
}
答案 0 :(得分: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 */);
您的问题的答案是否定的,您在调用之后不能立即使用异步操作的结果。如果可以,它就不会异步。
答案 1 :(得分: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调用完成时显示,但如果您在代码中的上一行之后立即检查小部件数组的长度,它将为零。< / p>