2009-09-21 38 views
16

嘿,所有。我看来似乎是一个微不足道的问题。我有以下的JavaScript:jQuery:等待函数完成继续处理?

$(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的功能,除非我想复制代码。有任何想法吗?

回答

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

谢谢你的答复。我将GetResults分开的原因是我在整个页面中多次重复使用该功能。我应该编辑我的帖子来说明。 – user135383

+0

如果您需要对来自多个位置的数据执行相同的处理,只需使用命名函数替换回调函数并在那里执行处理即可。 $ .getJSON(“/ controller/method /”,null,processData(data)); 函数processData(d){...} –

3

你可以这样做:

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

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

这是不可能的。

要么你让你的函数同步,要么改变代码的设计以支持异步操作。

0

移动数据处理步入回调:

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

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

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

这不会工作。您的return语句将从回调中返回,而不是从GetResults返回。此解决方案将无法正常工作,因为它不会正确使用回调 – mkoryak

+0

@mkoryak谢谢。我已经从回调中删除了回报。 – ctford

7

阿贾克斯已经给你一个回调,你应该使用它:

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

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

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

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

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

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

我不能移动的循环处理 成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编程模型。:)

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

这当然有效,但它阻止了UI线程,不是吗? (也许这是可以接受的,尽管鉴于我们迄今为止的信息似乎没有必要。) –

+0

是的,它确实阻塞了,但当然只是在请求期间。鉴于你正在寻找的东西,我没有看到任何其他方式。我沿着同一条路走了同步路线。 – ScottE

相关问题