2016-11-25 5 views
3

Я хочу вернуть второй ajaxcall в результате функции ajax, может ли кто-нибудь мне помочь.return AJAX внутри вызова 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: это записано в машинописи, но если заменить один с функцией и удалить: (тип) он работает в JS тоже.

+2

Я удаляю тэг angular2, так как вы используете jquery для создания своих http-звонков. Если вы считаете, что это неверно, сообщите мне. – echonax

+1

Ow да, конечно, я просто добавил его, потому что я использовал его в своем проекте, спасибо, что дал мне знать. – nusje2000

+0

Возможно, это решение вашей проблемы: [http://stackoverflow.com/a/22063821/4217744](http://stackoverflow.com/a/22063821/4217744) – simhumileco

ответ

0

Что вы должны сделать, это ЦЕПЬ вызовов.

Функция .done() является асинхронной. Поэтому он будет выполнять все, что вы передадите в качестве аргумента, когда ответ вернется. Возвращаемое значение этой функции не идет нигде.

Что вы должны сделать вместо этого: foo.then (функция() {/ * шаг 1 /}), то (функция ({/ шаг 2 * /})

Я хотел бы предложить чтение. . немного о asynchrounousity в Javascript

Это путь вы могли бы сделать это с обещаниями, я никогда не работал с JQuery, так что синтаксис может отличаться

редактировать:. Я хотел бы добавить, что не существует никакого способа верните значение ответа в свою начальную функцию. Лучшее, что вы можете сделать, это вернуть объект jqXHR, А затем вызовите «then()» или «done()» от вызывающего.

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); 
}); 

Я реализовал простой код, чтобы узнать, как работает Обещано объект:

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.