【问题标题】:$.ajax inside a single function to return result and promise?$.ajax 在单个函数中返回结果和承诺?
【发布时间】:2017-06-01 06:08:02
【问题描述】:

我有一个函数调用 ajax 来检索数据。我遇到的问题是进行嵌套的 ajax 调用,其中一个调用依赖于另一个调用,而 $.wait().then() 并没有真正起作用。我的问题有什么解决办法吗。这是一个例子......

function _Ajax(params){
if(params == ''){
    alert('no post params');
    return;
}
var xdata;
$.ajax({
    type: "POST",
    url: "/xml/",
    async: false,
    data: params,
    dataType: "xml",
    success: function(xml){
        xdata = xml;
    },
    error: function() {
        alert("An error occurred while processing XML file. Params:" + objToString(params));
    }
    });
    return xdata;
}

function A(a,b){
    _Ajax({a:a,b:b});
}
function B(a,b,c){
    _Ajax({a:a,b:b,c:c});
}
function C(a,b){
    A(a,b);
    B(a,b);
}
function D(a,b){
    _Ajax({a:a,b:b});
}
function E(){
    $.when(C(a,b)).then{function(){ D(a,b);});
}

我还尝试将 async 更改为 true,但它完全失败而没有返回任何数据。 谢谢

【问题讨论】:

标签: jquery ajax promise wait


【解决方案1】:

$.when 不会神奇地等待任何异步操作,您需要向它传递承诺 - 为此,您的所有函数实际上都需要 return 它们:

function _Ajax(params){
    if(params == ''){
        return $.Deferred().reject('no post params').promise();
    }
    return $.ajax({
        type: "POST",
        url: "/xml/",
        data: params,
        dataType: "xml"
    }).catch(function() {
        throw "An error occurred while processing XML file. Params:" + objToString(params));
    });
}

function A(a,b){
    return _Ajax({a:a,b:b});
}
function B(a,b,c){
    return _Ajax({a:a,b:b,c:c});
}
function C(a,b){
    return $.when(A(a,b), B(a,b));
}
function D(a,b){
    return _Ajax({a:a,b:b});
}
function E(){
    return C(a,b).then{function([xdata1], [xdata2]){ return D(a,b); });
}

【讨论】:

  • 这里最大的问题是_Ajax 函数返回promise,但我也需要它返回XML 结果。我认为解决方案之一是返回一个数组?
  • @Joseph 它应该返回一个承诺 for XML 结果,不是吗?您可以通过 then 回调的参数访问它。你打算在哪里使用xdata
  • 现有的数百个函数以不同的方式处理此 xdata 参数...
  • @Joseph 但肯定它是每个参数中的参数,而不是全局变量?你在 Promise 链的哪个位置调用它们?
  • 是的,它是一个参数。该功能目前不使用 Promise,因为直到现在才需要它
猜你喜欢
  • 2021-08-15
  • 2017-05-16
  • 2019-07-09
  • 1970-01-01
  • 2020-03-06
  • 2017-09-10
  • 2014-05-07
  • 1970-01-01
  • 2020-12-28
相关资源
最近更新 更多