javascript - ajax延迟链调用

标签 javascript jquery ajax

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

var obj = {};

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

    });

- Ajax 函数: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() 必须返回一个延迟或 promise ,以便您等待它或将其他操作链接到它,并且您可以只使用 $.ajax() 已经返回而不是创建自己的。

此外,没有理由在这里使用 $.when() 因为它实际上只会在您尝试等待并行运行的多个 Promise 时增加值(value),而这不是您的情况全部。因此,您可以对已有的各个 Promise 使用 .then() 处理程序。

此外,您确实不想在处理异步操作时使用全局变量。您可以链接 promise 并通过 promise 传递数据。

这是 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() 返回的 Promise。另请注意,它也不使用 success:error: 处理程序,因为这些处理程序也来自 Promise。

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

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

关于javascript - ajax延迟链调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30771635/

相关文章:

javascript - Angular - 计算 2 个范围之和的服务

javascript - 未捕获的类型错误 : Object [object Object] has no method 'wpdialog'

javascript - 是 $.ajax() jQuery 缩短正常代码的方式 : function loadXMLDoc() { var xmlhttp; if (window. XMLHttpRequest)

c# - 如何隐藏浏览器后退按钮上的模态弹出窗口

css - 为什么用 $.ajax() 加载的元素不显示 jQuery Mobile CSS?

javascript - 如何从在 gulp-run 中执行的进程打印控制台消息?

javascript - 在 Outlook 中注册 Office.EventType.RecipientChanged 处理程序的正确方法是什么?

javascript - 如何在 ul 标签下执行 JQuery UI 自动完成?

Jquery Accordion 高度:100%

javascript - 加载页面后如何设置单选按钮的默认值?