我如何等待AJAX​​请求的结果?

时间:2017-12-24 15:12:35

标签: javascript jquery ajax

我有一个ajax请求,我需要等待回复。我确信我必须使用承诺,但我真的害怕承诺,我永远无法理解。它有多个名为.then().resolved().reject().catch()等的内容,这让我感到困惑。

无论如何我必须使用它。所以这是我的代码不起作用:

Promise(function (resolve, reject) {
    var req = $.ajax({
        url: path,
        type: 'GET',
        data: {"name": value },

        beforeSend: function () {
            if (req != null) {
                req.abort();
            }
        },
        success: function (url) {
            resolve(url);
        },

        error: function (jqXHR, textStatus, errorThrown) {
            reject(textStatus);

        },

        timeout: 20000

    });
});

据我所知,ajax调用发生了,因为当我将console.log(url)放入success块时,它也打印了url并且一切正常。但我不知道怎么回来呢?我的意思是resolve()如何返回某些东西?我应该何时使用.then()

3 个答案:

答案 0 :(得分:2)

Promise应该像这样使用:

var promise1 = new Promise(function(resolve,reject){

    $.ajax({
       url : 'yourUrls',
       success : function(data){
         resolve(data);
       },
       error : function(err) {
          reject(err);
       }
    })
});

promise1.then(function(response){
   //response is what you resolve in promise
}).catch(function(err){
   //err is what you send while you reject inside promise
});

答案 1 :(得分:2)

BTW,$.ajax返回实现Promise接口的jqXHR对象,为它们提供Promise的所有属性,方法和行为。 所以你的代码看起来像这样

function onResolve () { alert( "$.ajax succeeded" ); }
function onReject () { alert( "$.ajax failed" ); }

// Promise syntax style
$.ajax({ 
    url: path,
    type: 'GET',
    data: {"name": "value"}
}).then(onResolve, onReject);

// or equivalent jQuery syntax style
$.ajax({
    url: path,
    type: 'GET',
    data: {"name": "value"},
    success: onResolve, 
    error: onReject
});

答案 2 :(得分:0)

您可以返回新的Promise,如:

 function ajaxDone() {
    return new Promise(function (resolve, reject) {
       $.ajax({
               url: path,
               type: 'GET',
               data: {"name": value },
               beforeSend: function () {
                  if (req != null) {
                       req.abort();
                        }
                    },
              success: function (url) {
                    resolve(url);
                       },
              error: function (jqXHR, textStatus, errorThrown) {
                     resolve(null);
                 },

              timeout: 20000
             });
    });
}

以及如何使用:

    ajaxDone().then(function (resolve) {
            if (resolve !== null && resolve !== undefined)
              //It is done
             else
               //not done
 });