AJAX 延迟链接调用

ajax deferred chaining call

本文关键字:调用 链接 延迟 AJAX      更新时间:2023-09-26

我有点困惑我正在使用callone()的结果来修改全局对象(我不确定是否有更好的方法来执行此操作),试图通过延迟完成此操作。当我调用two()时,全局对象应该用新数据修改

var obj = {};
var id = obj.id;
//global object 
    $.when(callone(obj)).then(calltwo(id),function(data)
    {
    });

- 阿贾克斯函数:1

function callone(requiredData)
{
 var d = new $.Deferred();
 var ajaxCall1 =   $.ajax({
            type:"POST",
            url: 'AB/',
            data: requiredData, 
            success: function(data) {
               //return data to the callee?
                d.resolve(p_obj);
                //set ID on the object
                obj.id = data.id;
                return obj;
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert(textStatus + ': ' + errorThrown);
            },
            always: function(data)  {  }
        });
}
function calltwo(id from callback one)
{

}

我在下面包含一个更简单的实现。

callone()必须返回延迟或承诺,以便您等待它或将其他操作链接到它,您可以使用$.ajax()已经返回的承诺,而不是创建自己的承诺。

此外,没有理由在这里使用$.when(),因为它实际上只在您尝试等待并行运行的多个承诺时才增加价值,而事实并非如此。 因此,您可以只对已有的个人承诺使用 .then() 处理程序。

此外,在处理异步操作时,您确实不想使用全局变量。 您可以链接承诺并将数据直接传递到承诺中。

以下是callone()应该是什么样子:

function callone(requiredData) {
    return $.ajax({
        type: "POST",
        url: 'AB/',
        data: requiredData
    });
}
function calltwo(...) {
    // similar to callone
    // returns promise from $.ajax()
}
callone(...).then(function(data) {
    // when callone is done, use the id from its result
    // and pass that to calltwo
    return calltwo(data.id);
}).then(function(data) {
    // process result from calltwo here
}, function(err) {
    // ajax error here
});

请注意,此代码不会创建任何新的延迟对象。 它只是使用已经从$.ajax()返回的承诺. 另请注意,它也没有使用success:error:处理程序,因为这些处理程序也来自承诺。

另请注意,从 .then() 处理程序中返回承诺会自动将其链接到上一个承诺中,因此在新返回的承诺也得到解决之前,不会解析上一个承诺。 这使您可以保持链条运行。

另请注意,从异步回调函数返回数据不会将数据返回给原始函数的调用方,因此您尝试从success:处理程序返回某些内容未完成任何操作。 相反,请使用承诺并通过承诺返回数据,因为它们专门设计用于将异步数据返回.then()处理程序。