在AJAX调用中返回AJAX

时间:2016-11-25 07:48:24

标签: javascript jquery ajax

我想返回第二个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。

2 个答案:

答案 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