0

我现在在 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;
                           }
                    });

              }

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

4

2 回答 2

0

简单回答是不。行为将是完全同步的或完全异步的。

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

答案是回调接受的参数与定义为 ajax 选项的.done()回调中的参数相同,即。,和.successdatatextStatusjqXHR

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
});

error和回调也是如此complete,因此 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 (从中派生 Promise)被解析/拒绝时传递的内容。

于 2012-12-21T09:14:52.193 回答
0

您不能在浪费 CPU 周期的情况下将异步方法转换为 JavaScript 中的同步。

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

于 2012-12-21T10:08:07.960 回答