Async使用promise设置变量并避免回调

时间:2014-10-02 17:58:58

标签: javascript angularjs promise

在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);
        });
}

2 个答案:

答案 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>