假设您有一个调用Web服务方法的Javascript函数。因此,webservice完成并调用一个回调函数,该函数具有结果。
如何将结果返回到调用Web服务方法的原始函数中?基本上,我正在尝试“同步”异步调用。
更新
这就是我想要做的。我正在根据Web服务的返回值进行验证。
$.validator.addMethod("zzz",
function(value, element) {
// Call web service function using ASP.NET Ajax.
// Get callback value to determine validity.
return this.optional(element) || ***return t/f based on validity***;
},
function(value, element) { return msg; }
);
所以我想我可以这样做:
$.validator.addMethod("zzz",
function(value, element) {
$.ajax({
async: false
url: **** web service url ****
success: set t/f to validity var
});
return this.optional(element) || ***return t/f based on validity var***;
},
function(value, element) { return msg; }
);
答案 0 :(得分:2)
由于你正在使用jQuery,你可以使用async:false
in your ajax command,如下所示:
$.ajax({
//options..
async: false
});
//this code will run after the request returns
但请注意,这会阻止UI(锁定浏览器),最好继续执行取决于success
回调结果的工作,如下所示:
$.ajax({
//options..
success: function(data) {
doSomethingWithResult(data);
}
});
答案 1 :(得分:1)
基本上,你不能,但你可以将这个功能分解为“之前”和“之后”的部分,如下所示:
function foo(a) {
var b, c;
// == The "before" part:
b = /* ... */;
// == Call the service:
callWebService(a, b, callback);
// == The "after" part is contained within the callback:
function callback(d) {
// Do something with a, b, c, and d
}
}
但重要的是要注意 foo
将在调用callback
之前返回。没有办法通过异步调用来阻止它,所以如果你想让函数返回一些东西,你将不得不重构(或使用同步调用,但这是一个非常糟糕的主意)。重构将涉及调用foo
以提供回调的任何内容,并期望结果以该方式提供而不是作为返回值。
答案 2 :(得分:1)
您要完成的是模拟sleep
命令,以便您的脚本“等待”您的ajax请求?但这并没有多大意义。这就是为什么你必须首先回调,一旦请求返回一个回复就继续流程,因为你无法预测它的响应时间。
答案 3 :(得分:1)
不是陈腐,但你不能从异步中创建同步性,只能反过来。您需要设计代码以实现此目的,这通常意味着在整个调用链中回调。
有一个特殊异常,即你可以在原始XMLHttpRequest的'open'方法的async参数上指定'false',这将导致send
方法阻塞直到它完成。但这可能与某些框架不兼容,并且非常不灵活。大多数JS都是异步的。
答案 4 :(得分:1)
你不应该这样做。从回调的角度继续处理。 如果呼叫没有返回,您可能会完全挂起浏览器。
如果您控制服务器端,那么您可以在js端编写一些代码来聚合调用,然后在服务器端写一些东西以解压缩并从聚合中的每个嵌套调用执行多个调用。当响应返回时,然后汇总这些并将其发送回去。这将节省性能,因为大型呼叫比许多小型呼叫便宜。
我们在我工作的项目上做到了这一点并且工作得非常好。由于所有的异步回调,它还整合了js端的逻辑,不会遍布全部。
答案 5 :(得分:0)
我能想到的唯一方法就是
function b(){
var a = null;
$.get("abc.json", {
success: function(data){
a = data;
}
});
while(a == null){}
alert(a);
}
b();
但一般情况下这并不好,可能会导致浏览器抱怨脚本需要很长时间才能完成。