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

时间:2009-09-21 17:54:47

标签: javascript 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的功能,除非我想复制代码。有什么想法吗?

9 个答案:

答案 0 :(得分:13)

将您的“使用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;
   });
}

答案 1 :(得分:7)

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

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

答案 2 :(得分:7)

我之前遇到过类似的事情。你必须同步运行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;
    }
});

答案 3 :(得分:3)

你可以这样做:

$(function() {
    PerformCall();        
});

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

答案 4 :(得分:2)

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

相反,您需要更改代码以使用回调来根据$.getJSON(...)调用返回的数据触发操作。以下内容应该有效:

$(function() {
  GetResults();
});

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

答案 5 :(得分:2)

鉴于您的更新要求......

  

我无法移动for循环处理   进入JSON的回调函数   请求,因为我正在重用   GetResults的功能有几个   整个页面的时间,除非我   想要复制代码。有什么想法吗?

...您可以修改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编程模型作斗争。 :)

答案 6 :(得分:0)

这是不可能的。

要么使您的功能同步,要么更改代码设计以支持异步操作。

答案 7 :(得分:0)

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

$(function() {
    GetResults();
});

function GetResults() {
   $.getJSON("/controller/method/", null, function(data) {

       for(var i = 0; i < data.length; i++) {
           // Do stuff with data
       }
   });
}

答案 8 :(得分:0)

您可以使用适当的参数进行回调...

$(function() {
    GetResults(function(data) {
      for(var i = 0; i < data.length; i++) {
        // Do stuff with data
      }
    });

});

function GetResults(func) {
   $.getJSON("/controller/method/", null, func);
}