Javascript 从jQuery执行同步Ajax请求?

Javascript 从jQuery执行同步Ajax请求?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我知道这听起来像是以前有人问过的问题,但在我所有的狩猎中,我找不到任何符合我所寻找的东西 我正在做一个很大程度上基于Ajax的项目。我使用的是jQuery,但即使它的代码经过了漂亮的简化,当我看到代码完全相同时,它仍然很混乱,除了一个命令通过数据字段 所以我尝试在处理函数中设置它,如下所示: function _call(task, opts, async) { if(typeof async !== "boolean") { async = true; } opts = $.e

我知道这听起来像是以前有人问过的问题,但在我所有的狩猎中,我找不到任何符合我所寻找的东西

我正在做一个很大程度上基于Ajax的项目。我使用的是jQuery,但即使它的代码经过了漂亮的简化,当我看到代码完全相同时,它仍然很混乱,除了一个命令通过
数据
字段

所以我尝试在处理函数中设置它,如下所示:

function _call(task, opts, async) {
    if(typeof async !== "boolean") { async = true; }
    opts = $.extend({}, opts, options);
    $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        async:async,
        data: { task: task, opts: opts }
    }).done(function(data) { return data; });
}
对于那些通读的人,你会注意到有一个变量,
选项
,未在示例中定义。事实上 已经分配了,只是为了清楚起见省略了

我意识到这不起作用,因为即使将其设置为
async:false
,代码在调用
\u call(…)
后仍会继续,因此无法及时获得结果。我尝试了几种不同的变体,包括将匿名函数传递给处理程序,然后将其用作
.done()
函数,但它不会与外部变量交互,因此无法达到目的

我所要寻找的是一个系统,它可以让我像这样使用它:

var returnedData = _call("thisismytask");
var returnedDataWithOptions = _call("thisisanothertask", {'option': 'option1'});
_call("thisismytask", null, function(returnedData) {
   //use returnData
});

_call("thisisanothertask", {'option': 'option1'}, function(returnedDataWithOptions) {
  //use returnedDataWithOptions
});
function _call(task, opts) {
    opts = $.extend({}, opts, options);
    return $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        data: { task: task, opts: opts }
    });
}
$.when(
    _call("thisismytask"),
    _call("thisisanothertask", {'option': 'option1'})
).done(function(firstCallResults, secondCallResults) {
    //*CallResults is an array with the following structure: [data, statusText, jqXHR]
    var returnedData = firstCallResults[0];
    var returnedDataWithOptions = secondCallResults[0];
    ...
});
我真的希望这是可能的。我相信这是正确的,因为函数的主要目的是消除对不必要的重复代码的需要


谢谢。:)

你可能是最好的选择

function _call(task, opts, callback) {
    opts = $.extend({}, opts, options);

    $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        data: { task: task, opts: opts }
    }).done(function(data) { callback(data); });
}
像这样使用

_call("thisisanothertask", {'option': 'option1'}, function(data) {
   //do things with data
});
你真的无法做到这一点,因为你的呼叫无法立即返回,因为可能需要一段时间才能得到响应,即使你可以,它也可能会锁定你的浏览器,这是不好的

var returnedData = _call("thisismytask");
var returnedDataWithOptions = _call("thisisanothertask", {'option': 'option1'});
您需要像这样使用它:

var returnedData = _call("thisismytask");
var returnedDataWithOptions = _call("thisisanothertask", {'option': 'option1'});
_call("thisismytask", null, function(returnedData) {
   //use returnData
});

_call("thisisanothertask", {'option': 'option1'}, function(returnedDataWithOptions) {
  //use returnedDataWithOptions
});
function _call(task, opts) {
    opts = $.extend({}, opts, options);
    return $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        data: { task: task, opts: opts }
    });
}
$.when(
    _call("thisismytask"),
    _call("thisisanothertask", {'option': 'option1'})
).done(function(firstCallResults, secondCallResults) {
    //*CallResults is an array with the following structure: [data, statusText, jqXHR]
    var returnedData = firstCallResults[0];
    var returnedDataWithOptions = secondCallResults[0];
    ...
});
如果您需要此任务的结果,请在执行此任务之前执行以下操作:

_call("thisismytask", null, function(returnedData) {

   _call("thisisanothertask", {'option': 'option1'}, function(returnedDataWithOptions) {
     //use returnData

     //use returnedDataWithOptions
   });

});
您可以这样做:

function _call(task, opts) {
    opts = $.extend({}, opts, options);
    return $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        data: { task: task, opts: opts }
    });
}
它消除了将回调传递到
\u call
的需要,但功能完全相同

_call("thisisanothertask", {'option': 'option1'}).then(function(data) {
  // function body here
});

您应该使用回调。您也不应该使用
async:false
,因为这将阻止浏览器中的UI线程。您可以使用来同步各种任务。首先更改您的方法,如下所示:

var returnedData = _call("thisismytask");
var returnedDataWithOptions = _call("thisisanothertask", {'option': 'option1'});
_call("thisismytask", null, function(returnedData) {
   //use returnData
});

_call("thisisanothertask", {'option': 'option1'}, function(returnedDataWithOptions) {
  //use returnedDataWithOptions
});
function _call(task, opts) {
    opts = $.extend({}, opts, options);
    return $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        data: { task: task, opts: opts }
    });
}
$.when(
    _call("thisismytask"),
    _call("thisisanothertask", {'option': 'option1'})
).done(function(firstCallResults, secondCallResults) {
    //*CallResults is an array with the following structure: [data, statusText, jqXHR]
    var returnedData = firstCallResults[0];
    var returnedDataWithOptions = secondCallResults[0];
    ...
});
现在你可以这样称呼它:

var returnedData = _call("thisismytask");
var returnedDataWithOptions = _call("thisisanothertask", {'option': 'option1'});
_call("thisismytask", null, function(returnedData) {
   //use returnData
});

_call("thisisanothertask", {'option': 'option1'}, function(returnedDataWithOptions) {
  //use returnedDataWithOptions
});
function _call(task, opts) {
    opts = $.extend({}, opts, options);
    return $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        data: { task: task, opts: opts }
    });
}
$.when(
    _call("thisismytask"),
    _call("thisisanothertask", {'option': 'option1'})
).done(function(firstCallResults, secondCallResults) {
    //*CallResults is an array with the following structure: [data, statusText, jqXHR]
    var returnedData = firstCallResults[0];
    var returnedDataWithOptions = secondCallResults[0];
    ...
});

通过这种方式,您可以保留AJAX异步特性的所有优点(除非服务器不支持,否则这些任务将并行运行),并在所有结果都可用时将它们恢复到一起。

我找到了一个解决方案@斯拉沃向我指出了这一点


当您发出同步请求时,应该是

示例-

现在我只需要将文本解码为正确的JSON。谢谢大家。:)

使用jQuery的语法- 这对我很有效

$.ajaxSetup({async: false});

看到这个问题:@Slavo谢谢,这个链接很有帮助。我以前没有遇到过它。我尝试过这个,但不幸的是,我仍然无法使用它与匿名函数之外的变量进行交互。我错过什么了吗/这取决于你在做什么,你能举个例子吗?和我评论@cpac的答案时的问题一样:/@Spiritfyre,您如何处理
返回的数据
?返回承诺FTW。OP-您不能
从异步调用中返回有用的值,但可以返回承诺并注册回调。不要使用
async:false
,这很糟糕,mkay!这不是一个有用的解决方案。请学习正确的异步编程方法。因为最初的问题是“从jQuery执行同步Ajax请求?”-这个答案是最好的解决方案。当然,异步ajax调用有其优点,而且线程更安全,但问题不是“异步ajax调用比同步调用好吗?”——此解决方案是同步的,在收到响应文本后返回响应文本。如果服务器响应,例如404找不到空正文,则可以为空。通过$.ajaxSetup添加一些全局钩子可能会有所帮助。例如错误代码回调或错误并完成。