jQuery:等待函数完成继续处理?

大家好。 我看起来似乎是一个微不足道的问题。 我有以下JavaScript:

$(function() { var r = GetResults(); for(var i = 0; i < r.length; i++) { // Do stuff with r } }); function GetResults() { $.getJSON("/controller/method/", null, function(data) { return data; }); } 

由于我正在异步调用方法,脚本继续执行,当遇到for循环时, r显然不会有值。 我的问题是:当我有一个正在进行异步操作的方法,并且我依赖于它在主块中返回的数据时,如何在数据返回之前暂停执行? 就像是:

 var r = GetResults(param, function() { }); 

其中函数是回调函数。 我无法将for循环处理移动到JSON请求的回调函数中,因为我在整个页面中多次重用GetResults的function,除非我想复制代码。 有任何想法吗?

将你的“使用r做块”移动到$ .getJSON回调中。 在你交付之前你不能用r做东西,你必须使用r的第一个机会就是回调…那么就这样做吧。

 $(function() { var r = GetResults(); }); function GetResults() { $.getJSON("/controller/method/", null, function(data) { for(var i = 0; i < data.length; i++) { // Do stuff with data } return data; }); } 

Ajax已经给你一个回调,你应该使用它:

 function dostuff( data ) { for(var i = 0; i < data.length; i++) { // Do stuff with data } }; $(document).ready( function() { $.getJSON( "/controller/method/", null, dostuff ); }); 

我之前遇到过类似的事情。 您必须同步运行ajax调用。

这是我的工作示例:

 $.ajax({ type: "POST", url: "/services/GetResources", contentType: "application/json; charset=utf-8", dataType: "json", data: '{resourceFileName:"mapedit",culture:"' + $("#lang-name").val() + '"}', cache: true, async: false, // to set local variable success: function(data) { localizations = data.d; } }); 

你可以这样做:

 $(function() { PerformCall(); }); function PerformCall() { $.getJSON("/controller/method/", null, function(data) { for(var i = 0; i < data.length; i++) { // Do stuff with data } }); } 

简短的回答是你不能阻止异步操作……这当然是“异步”的意思。

相反,您需要更改代码以使用回调来根据$.getJSON(...)调用返回的数据触发操作。 像下面这样的东西应该工作:

 $(function() { GetResults(); }); function GetResults() { $.getJSON("/controller/method/", null, function(data) { for(var i = 0; i < data.length; i++) { // Do stuff with data } }); } 

鉴于您的更新要求……

我无法将for循环处理移动到JSON请求的回调函数中,因为我在整个页面中多次重用GetResults的function,除非我想复制代码。 有任何想法吗?

…你可以修改GetResults()以接受一个函数作为参数,然后你将作为$.getJSON回调执行(空中代码警告):

 $(function() { GetResults(function(data) { for(var i = 0; i < data.length; i++) { // Do stuff with data } }); }); function GetResults(callback) { $.getJSON("/controller/method/", null, callback); } 

从一般的答案潮流中可以看出,最好不要尝试对抗异步jQuery编程模型。 🙂

这是不可能的。

您可以使您的函数同步,也可以更改代码的设计以支持异步操作。

你可以使用一个应该很好地工作的参数回调…

 $(function() { GetResults(function(data) { for(var i = 0; i < data.length; i++) { // Do stuff with data } }); }); function GetResults(func) { $.getJSON("/controller/method/", null, func); } 

将数据处理移动到回调中:

 $(function() { GetResults(); }); function GetResults() { $.getJSON("/controller/method/", null, function(data) { for(var i = 0; i < data.length; i++) { // Do stuff with data } }); }