【问题标题】:jQuery Deferred Ajax Calls and Returning Ajax ResponsesjQuery 延迟 Ajax 调用和返回 Ajax 响应
【发布时间】:2012-11-06 11:02:31
【问题描述】:

我现在正在 jQuery 中进行同步 AJAX 调用。父函数有什么方法可以在保持异步调用的同时返回 Ajax 响应。我能找到的唯一解决方案是使用回调函数。我真的不想写回调函数,因为我打算把这个对象放在一个变量中。

例如

var ajax = serviceinterface.rawServiceCall(“http://user.myservice.com/endpoint”, “post”, {name : “xyz”});

我可能也想这样使用它

$.when(serviceinterface.rawServiceCall(endpoint1, “get”), serviceinterface.rawSCACall(endpoint2, ‘get’)).done(function(){
    // do something here
});

这是我的函数代码,同步调用工作得很好,但我想进行异步调用。

rawServiceCall : function(endpoint, type, payload) {
                     type = typeof type !== 'undefined' ? type : "get";
                     payload = typeof type !== 'undefined' ? payload : null;

                     return $.ajax({
                           url : endpoint,
                           type : type,
                           data : payload,
                           async : false,
                           dataType : 'json',
                           headers: {
                                 accept : "application/json"
                           },
                           success : function(data){
                                 return data;
                           }
                    });

              }

P.S - 我不想浪费 CPU 周期或让网页的其他部分等待它首先加载。或者有什么更好的方法?

【问题讨论】:

    标签: javascript ajax jquery deferred


    【解决方案1】:

    简单的答案是否定的。行为将完全同步或完全异步。

    但我认为您没有问题,因为您的代码是您寻求的解决方案的 99%。您只需要知道如何评估在.done() 回调中返回的data

    答案是.done() 回调采用的参数与定义为ajax 选项的success 回调中的参数相同,即。 datatextStatusjqXHR

    rawServiceCall: function(endpoint, type, payload) {
        type = type || "get";
        payload = payload || null;
        return $.ajax({
            url: endpoint,
            type: type,
            data: payload,
            async: false,
            dataType: 'json',
            headers: {
                accept: "application/json"
            }
        });
    }
    
    serviceinterface.rawServiceCall(endpoint1).done(function(data, textStatus, jqXHR) {
        //do something here
    });
    
    $.when(serviceinterface.rawServiceCall(endpoint1), serviceinterface.rawServiceCall(endpoint2)).done(function(data, textStatus, jqXHR) {
        // do something here
    });
    

    errorcomplete 回调也是如此,因此 jQuery.ajax 承诺的回调等价物的完整列表是:

    • .done(function(data, textStatus, jqXHR){...}) 等价于success: function(data, textStatus, jqXHR){...}

    • .fail(function(jqXHR, textStatus, errorThrown){...}) 等价于error: function(jqXHR, textStatus, errorThrown){...}

    • .always(function((jqXHR, textStatus){...}) 等价于complete: function((jqXHR, textStatus){...}

    每个 jQuery Promise 对象都有 .done().fail().always() 方法,但是这些方法的回调(如果有)所采用的参数会根据原始 Deferred 时传递的内容(承诺来自派生)被解决/拒绝。

    【讨论】:

      【解决方案2】:

      您无法将异步方法转换为 JavaScript 中的同步而不浪费 CPU 周期。

      停止执行代码的唯一方法是使用 alert()。在 JS 中你从不睡觉,你只是闲着。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        相关资源
        最近更新 更多