javascript - 如何从 AngularJS $http.get().then() 获得响应
问题描述
我最近开始从 Bootstrap 3 升级到 Bootstrap 4,这需要我也从 AngularJS 1.5.8 升级到至少 AngularJS 1.6.1。我有一个带有以下代码设置的简单 AngularJS/MVC 应用程序:
/scripts/app.js(包含路由) /scripts/controllers.js(包含控制器、方法调用等) /scripts/services.js(包含命中 C# 控制器并带回数据的回调方法,或“做事” "(CRUD 方法)
在我的 controllers.js 中,我有一个方法:
function init() {
api.initialIndexLoad(
function(result) {
if (result.error) {
notificationService.danger("<h5>An error occurred.</h5><h6>Details: {0}</h6>".format(result.error));
} else {
vm.dataList = result.theDataFromCSharp;
}
vm.loaded = true;
}
);
}
init();
这会调用我的 services.js,我有以下代码:
"use strict";
angular
.module("CustList.services", ["ngResource"])
.service("api",
function api($resource, $http, notificationService) {
function handleError(err, fn) {
if (!fn) {
notificationService.error(err);
} else {
fn(err);
}
}
return {
initialIndexLoad: function(callback, error) {
$http.get("/Customers/InitialIndexLoad")
.success(callback)
.error(function(e) {
handleError(e, error);
});
}
};
}
);
因此,当然,在将我的库更新到 AngularJS 1.6.1(实际上,我直接升级到 AngularJS 1.7.5)之后,我开始遇到错误,并且过了一段时间发现 promise 语法发生了变化。所以我试图改变它,并将我的 services.js 更新为:
"use strict";
angular
.module("CustList.services", ["ngResource"])
.service("api",
function api($resource, $http, notificationService) {
function handleSuccess(response) {
return response.data;
}
function handleError(err, fn) {
if (!fn) {
notificationService.error(err);
} else {
fn(err);
}
}
return {
initialIndexLoad: function() {
$http
.get("/Customers/InitialIndexLoad")
.then(handleSuccess)
.catch(handleError);
}
};
}
);
错误消失了,我以为我已经完成了这个升级,直到我意识到:我实际上并没有取回数据!handleSuccess
我创建的那个新方法是在响应中获取数据,但return response.data
没有将数据返回到我的 controllers.js 方法,所以我可以将它插入vm.dataList
.
它不会抛出错误——它什么也不做。我很感激帮助解决这个问题!
解决方案
服务方法需要返回$http
承诺。
app.service("api",
function api($http, notificationService) {
function handleSuccess(response) {
return response.data;
}
function handleError(err) {
notificationService.error(err);
throw err;
}
return {
initialIndexLoad: function() {
̶$̶h̶t̶t̶p̶
return $http
.get("/Customers/InitialIndexLoad")
.then(handleSuccess)
.catch(handleError);
}
};
}
);
注意errorHandler
需要重新抛出错误。否则,处理程序会将被拒绝的承诺转换为已履行的承诺。
控制器需要使用.then
和.catch
方法:
function init() {
var promise = api.initialIndexLoad();
promise.then(function(result) {
if (result.error) {
notificationService.danger("<h5>An error occurred.</h5><h6>Details: {0}</h6>".format(result.error));
} else {
vm.dataList = result.theDataFromCSharp;
}
vm.loaded = true;
}).catch(functions(err) {
console.log(err);
throw err;
});
}
该.then
方法返回一个新的 PromisesuccessCallback
,该 Promise 通过,的返回值被解析或拒绝(除非该值是一个 Promise,在这种情况下,它使用在该 Promise 中使用Promise ChainingerrorCallback
解析的值来解析。
有关详细信息,请参阅
推荐阅读
- c - c语言中的词法作用域是什么?
- php - ckeditor 5中的图像上传不适用于laravel 8
- c++ - 最小异或问题,超过时间限制,在少数情况下给出不同的答案
- javascript - 将按钮的 ID 传递给我的模态文本框
- python - Python/Numpy:获取二维矩阵中的前 k 个最大值作为掩码
- opencv - opencv写视频的速度是不是比实际设置速度慢?
- reactjs - 如何在 React 的 ProductPage 链接中获取产品 ID?
- python - python 的 file.read() 不返回文本文件中的字符串
- dom - 如何使用 J-script 解决此网页登录问题?
- twilio - 如何获取 Twilio 出站呼叫的确切状态