我可以在不使用$ q的情况下执行并转发AngularJS $ http调用的结果吗?

Sam*_*tar 1 javascript angularjs

我有类似下面的getData函数的函数.

我知道$ http会返回一个承诺.在我目前的设置中,我使用$ q以便我可以对结果进行一些处理,然后返回另一个承诺:

var getData = function (controller) {
    var defer = $q.defer();
    $http.get('/api/' + controller + '/GetData')
        .success(function (data) {
            var dataPlus = [{ id: 0, name: '*' }].concat(data);
            defer.resolve({
                data: data,
                dataPlus: dataPlus
            });
        })
        .error(function (error) {
            defer.reject({
                data: error
            });
        });
    return defer.promise;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以做到这一点,而无需使用AngularJS $ q(或任何其他$ q实现)或上面的代码是唯一的方法吗?请注意,我不是在寻找一个解决方案,我将onSuccess和onError传递给getData作为参数.

谢谢

Joh*_*son 5

正如你所说,$http.get已经回复了一个承诺.有关承诺的最好的事情之一是它们很好地构成.添加更多success,then或者done只是按顺序运行它们.

var getData = function (controller) {
    return $http.get('/api/' + controller + '/GetData')
        .success(function (data) {
            var dataPlus = [{ id: 0, name: '*' }].concat(data);
            return {
                data: data,
                dataPlus: dataPlus
            };
        })
        .error(function (error) {
            return {
                data: error
            };
        });
}
Run Code Online (Sandbox Code Playgroud)

这意味着使用getData(controller).then(function (obj) { console.log(obj) });,将打印成功处理程序返回的对象.

如果您愿意,可以继续编写它,添加更多功能.假设您希望始终记录结果和错误.

var loggingGetData = getData(controller).then(function (obj) {
    console.log(obj);
    return obj;
}, function (err) {
    console.log(err);
    return err;
});
Run Code Online (Sandbox Code Playgroud)

然后,您可以getData像这样使用您的日志记录:

loggingGetData(controller).then(function (obj) {
    var data = obj.data;
    var dataPlus = obj.dataPlus;
    // do stuff with the results from the http request
});
Run Code Online (Sandbox Code Playgroud)

如果$http请求结算,结果将首先通过您的初始成功处理程序,然后通过日志记录,最后到达最终函数.

如果它没有解析,它将通过初始错误处理程序到由定义的错误处理程序loggingGetData并打印到控制台.你可以继续以这种方式添加promises并构建非常先进的东西.