我想返回第二个ajaxcall作为ajax函数的结果,任何人都可以帮助我。
private ajax(url: string, method:string, data:any = null) {
var _this = this;
return this.csrfWithoutDone().done(function (res) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': res
}
});
return $.ajax({
url: _this.baseUrl + url,
type: method,
data: data,
});
});
}
csrfWithoutDone函数:
return $.ajax({
url: _this.baseUrl + '/api/csrf',
type: 'GET'
});
BTW:这是用打字稿写的,但如果用函数替换private并删除:(类型)它也适用于js。
答案 0 :(得分:0)
你应该做的是CHAIN这些电话。
.done()函数是异步的。因此,当响应返回时,它将执行您传递的任何内容作为参数。该函数的返回值无处可去。
你应该做的是: foo.then(function(){/ * step 1 /})。then(function({/ step 2 * /})
我建议您在Javascript中阅读一些关于asynchrounousity的内容。
这是你使用promises的方式,我从未使用过jQuery,所以语法可能不同。
编辑:我想补充说,没有办法在初始函数中返回响应值。你能做的最好的就是返回jqXHR对象,然后从调用者那里调用“then()”或“done()”。
答案 1 :(得分:0)
您应该在ajax
函数中返回承诺的对象,以便能够确定您的请求是否已完成。由于您使用的是jQuery,因此可以使用Deferred Objects:
function ajax(url, method, data) {
var _this = this;
// Create a deferred object
var dfd = $.Deferred();
this.csrfWithoutDone().done(function (res) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': res
}
});
$.ajax({
url: _this.baseUrl + url,
type: method,
data: data,
}).done(function (response) {
// your inner ajax has been done
// tell your promised object and pass the response to it
dfd.resolve(response);
});
});
// return promised
return dfd.promise();
}
// call your ajax function, it is a promised object
var ajaxRequest = ajax();
// so you can wait for the response
ajaxRequest.done(function (response) {
// your ajax has been done and you have the response
console.log(response);
});
我已经实现了一个简单的代码来了解Promised对象的工作原理:
function ajax() {
var dfd = $.Deferred();
setTimeout(function () {
dfd.resolve('Hello World');
}, 1000);
return dfd.promise();
}
var testResult = ajax();
testResult.done(function (response) {
alert(response);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
您也可以使用原生Promise Object,也许您需要填充,以支持所有浏览器,请参阅Can I Use。