Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以在不使用$q的情况下对AngularJS$http调用的结果进行操作并转发吗?_Javascript_Angularjs - Fatal编程技术网

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

Javascript 我可以在不使用$q的情况下对AngularJS$http调用的结果进行操作并转发吗?,javascript,angularjs,Javascript,Angularjs,我有下面的getData函数 我知道$http返回一个承诺。在我目前的设置中,我使用$q,这样我可以对结果进行一些处理,然后返回另一个承诺: var getData = function (controller) { var defer = $q.defer(); $http.get('/api/' + controller + '/GetData') .success(function (data) { var dataPlus = [{

我有下面的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的解决方案


谢谢

就像你说的那样,
$http.get
已经返回了一个承诺。关于承诺,最好的一点是,它们写得很好。添加更多的
成功
然后
,或
完成
只需按顺序运行它们

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(函数(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
定义的错误处理程序,并打印到控制台。您可以继续以这种方式添加承诺,并构建真正高级的东西。

正如您所说的,
$http.get
已经返回了承诺。关于承诺,最好的一点是,它们写得很好。添加更多的
成功
然后
,或
完成
只需按顺序运行它们

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(函数(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
定义的错误处理程序,并打印到控制台。您可以通过这种方式不断添加承诺,构建真正高级的东西。

您可以尝试:

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

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

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

您可以尝试:

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

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


另一个(更好的?)选项是对
$http.get()
调用进行局部增强的
transformResponse
,只返回$http承诺。

$http.get
本身返回承诺。您可以返回它?
$http.get
本身返回一个承诺。您可以退回吗?
.error
是否退回原始承诺?您不需要从
.get
返回结果吗?@RGraham
.error
.success
返回相同的承诺链。您的.error回调中的defer.reject()未定义。你是想删除或更改它吗?谢谢Erik,在文档中找不到关于那些http特定方法的任何内容returned@ErikKronberg-谢谢你的回答。为了清楚起见,您是否可以更新您的答案,以显示出现错误的情况,并在返回之前进行了预处理。为了让问题更清楚,我只是对这个问题做了一个小改动。我很想看看代码。谢谢。是否返回原始承诺?您不需要从
.get
返回结果吗?@RGraham
.error
.success
返回相同的承诺链。您的.error回调中的defer.reject()未定义。你是想删除或更改它吗?谢谢Erik,在文档中找不到关于那些http特定方法的任何内容returned@ErikKronberg-谢谢你的回答。为了清楚起见,您是否可以更新您的答案,以显示出现错误的情况,并在返回之前进行了预处理。为了让问题更清楚,我只是对这个问题做了一个小改动。我很想看看代码。谢谢