返回的对象在自定义ajax服务中未定义
我创建了一个AngularJS服务,它向服务器执行ajax请求并将响应对象返回给控制器。下面是我的服务返回的对象在自定义ajax服务中未定义
app.factory('ajaxService', function() {
return {
ajaxcall: function(url, type, data, handler) {
$.ajax({
url: url,
type: type,
data: data,
beforeSend: function(xhr) {
xhr.setRequestHeader("X-OCTOBER-REQUEST-HANDLER", handler);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
}
})
.done(function(response) {
console.log("ajaxService done: ");
console.log(response);
return response;
})
.fail(function(response) {
console.log("in onCheckUser-error: ajaxService ");
});
}
}
});
控制器定义如下
var app = angular.module('starter', [])
app.controller('myCtrl', function(ajaxService) {
var res = {};
res = ajaxService.ajaxcall("https://www.travelmg.in/check-login",'POST','',"onCheckLogin");
console.log(res);
});
在这里,我得到的ajaxService服务控制台预期的响应。当我返回响应时,我在控制台的res变量中看到一个“undefined”值。
我不明白为什么res变量是未定义的。请建议
那是因为你做的异步调用,这意味着它不会立即返回结果。
解决此问题的唯一方法是接收从$.ajax
返回的承诺对象&使用.done()
函数就可以接收成功的数据。
你需要做什么:
- 移动
done()
&fail()
外部服务工厂。 - 将ajax promise对象一直返回给消费者,即控制器。
JS代码:
//service factory code
return {
ajaxcall: function(url, type, data, handler) {
return $.ajax({
url: url,
type: type,
data: data,
beforeSend: function(xhr) {
xhr.setRequestHeader("X-OCTOBER-REQUEST-HANDLER", handler);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
}
});
}
}
//controller code
app.controller('myCtrl', function(ajaxService) {
var res = {};
ajaxService.ajaxcall("https://www.travelmg.in/check- login",'POST','',"onCheckLogin")
.done(function(response) {
console.log("ajaxService done: ");
console.log(response);
//return response; // dont return instead process the result here
})
.fail(function(response) {
console.log("in onCheckUser-error: ajaxService ");
});
});
注:
我个人不喜欢混合
jquery
和angularjs
库,除非真正需要jquery
针对一些第三方库。两者都是具有不同意识形态的两种不同的框架,所以不要混淆它们。如果您提到
jquery
仅适用于$.ajax
api?那么我建议你使用$http
,其API与$.ajax
相同。 ref:https://docs.angularjs.org/api/ng/service/ $ http
@dremweiver:谢谢您的回复,但是我已经尝试了您建议的方法,收到错误信息为:“Uncaught TypeError:无法读取属性'done' undefined“ –
你能检查你的返回promise对象是否来自jquery ajax,'return $ .ajax({' – dreamweiver
return $ .ajax({working! –
您已经构建了角度应用程序,因此使用$http
指令可以方便地进行ajax调用。注入$http
是你的服务,那么你可以处理响应这样:
ajaxService.ajaxcall("https://www.travelmg.in/check-login",'POST','',"onCheckLogin").then(function(response) {
console.log(response.data);
});
Hello @ Dev-One,我在我的ajax请求中使用了一些额外的头文件,但不知道如何使用$ http服务添加它们。 –
@gauravbhand,阅读本文档:https://docs.angularjs.org/api/ng/service/$http – Sajal
我引用了上述文档,并使用$ http服务实现了我的ajax请求。当我在ajaxService服务中包含.then函数时,我在控制台中得到有效的响应。但是当我尝试将.then函数移入控制器时,我得到与“控制器”相同的错误。js:37 Uncaught TypeError:无法读取未定义的属性'then' –
是否有原因使用'$ .ajax'而不是'$ http'? –