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

时间:2014-05-21 14:35:11

标签: 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;
}

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

由于

2 个答案:

答案 0 :(得分:5)

正如您所说$http.get已经返回一个承诺。有关承诺的最好的事情之一是它们很好地构成。添加更多successthendone只是按顺序运行它们。

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

这意味着使用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;
});

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

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

如果$http请求解析,结果将首先通过您的初始成功处理程序,然后通过日志记录,最后在此处的最终函数中结束。

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

答案 1 :(得分:0)

您可以尝试:

使用提供response方法的interceptor。但是我不喜欢它,因为它将处理响应的代码移动到另一个地方,使得理解和调试代码变得更加困难。

在这种情况下,使用$ q将是最好的IMO。

另一个(更好?)选项是transformResponse调用的本地增强$http.get() transformer,只返回$ http承诺。