Asp.net 将回调信息返回到原始调用函数

Asp.net 将回调信息返回到原始调用函数,asp.net,javascript,jquery,web-services,Asp.net,Javascript,Jquery,Web Services,假设您有一个调用web服务方法的Javascript函数。这样webservice就完成并调用了一个回调函数,该函数具有结果 如何将该结果返回到调用web服务方法的原始函数中?本质上,我试图“同步”一个异步调用 更新: 这就是我想做的。我正在基于web服务的返回值进行验证 $.validator.addMethod("zzz", function(value, element) { // Call web service function using ASP.NET A

假设您有一个调用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; }
);

基本上,您不能,但您可以将该函数分解为“之前”和“之后”部分,如下所示:

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
将在调用
回调
之前返回。异步调用无法防止这种情况发生,因此如果希望函数返回某些内容,则必须重构(或使用同步调用,但这是一个非常糟糕的主意)。重构将涉及调用
foo
的任何函数,以提供回调,并期望以这种方式提供结果,而不是作为返回值。

本质上,您不能,但您可以将该函数分解为“before”和“after”部分,如下所示:

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
将在调用
回调
之前返回。异步调用无法防止这种情况发生,因此如果希望函数返回某些内容,则必须重构(或使用同步调用,但这是一个非常糟糕的主意)。重构将涉及调用
foo
的任何东西,以提供回调,并期望以这种方式提供结果,而不是作为返回值。

那么您试图完成的是模拟
sleep
命令,所以您的脚本“等待”ajax请求?但这并没有真正的意义。这就是为什么您必须首先回调,以便在请求返回应答后继续流,因为您无法预测其响应时间。

您试图完成的是模拟一个
sleep
命令,所以您的脚本“等待”ajax请求?但这并没有真正的意义。这就是为什么您必须首先回调,以便在请求返回应答后继续流,因为您无法预测其响应时间。

这不是陈词滥调,但您不能从异步创建同步,只能从相反的方向创建同步。您需要设计代码来实现这一点,这通常意味着整个调用链都需要回调


有一个特殊的异常,即您可以在原始XMLHttpRequest的“open”方法的异步参数上指定“false”,这将导致
send
方法阻塞,直到完成为止。但这可能与某些框架不兼容,而且相当缺乏灵活性。大多数JS都是异步的。

这不是陈词滥调,但你不能从异步中创建同步,只能从异步中创建同步。您需要设计代码来实现这一点,这通常意味着整个调用链都需要回调


有一个特殊的异常,即您可以在原始XMLHttpRequest的“open”方法的异步参数上指定“false”,这将导致
send
方法阻塞,直到完成为止。但这可能与某些框架不兼容,而且相当缺乏灵活性。大多数JS都是异步的。

我能想到的唯一方法是

function b(){
    var a = null;
    $.get("abc.json", {
        success: function(data){
            a = data;
        }
    });
    while(a == null){}
    alert(a);
}
b();

但一般来说,这并不好,可能会导致浏览器抱怨脚本完成时间太长。

我唯一能想到的方法是

function b(){
    var a = null;
    $.get("abc.json", {
        success: function(data){
            a = data;
        }
    });
    while(a == null){}
    alert(a);
}
b();

但通常这并不好,可能会导致浏览器抱怨脚本的完成时间太长。

因为您使用的是jQuery,所以可以使用,如下所示:

$.ajax({
  //options..
  async: false
});
//this code will run after the request returns
$.ajax({
  //options..
  success: function(data) {
    doSomethingWithResult(data);
  }
});
注意,虽然这会阻塞UI(锁定浏览器),但最好根据
success
回调中的结果继续工作,如下所示:

$.ajax({
  //options..
  async: false
});
//this code will run after the request returns
$.ajax({
  //options..
  success: function(data) {
    doSomethingWithResult(data);
  }
});

因为您使用的是jQuery,所以可以使用以下命令:

$.ajax({
  //options..
  async: false
});
//this code will run after the request returns
$.ajax({
  //options..
  success: function(data) {
    doSomethingWithResult(data);
  }
});
注意,虽然这会阻塞UI(锁定浏览器),但最好根据
success
回调中的结果继续工作,如下所示:

$.ajax({
  //options..
  async: false
});
//this code will run after the request returns
$.ajax({
  //options..
  success: function(data) {
    doSomethingWithResult(data);
  }
});

你不应该那样做。从回调的角度继续处理。 如果呼叫未返回,您将面临完全挂起浏览器的风险

如果您控制服务器端,那么您可以在js端编写一些代码来聚合调用,然后在服务器端编写一些代码来解包并从聚合中的每个嵌套调用执行多个调用。当回复返回时,将其聚合并发送回。这将节省性能,因为大型呼叫比许多小型呼叫更便宜


我们在我参与的一个项目中做到了这一点,效果非常好。它还整合了js端的逻辑,使其不会由于所有异步回调而分散开来。

您不应该这样做。从回调的角度继续处理。 如果呼叫未返回,您将面临完全挂起浏览器的风险

如果您控制服务器端,那么您可以在js端编写一些代码来聚合调用,然后在服务器端编写一些代码来解包并从聚合中的每个嵌套调用执行多个调用。当回复返回时,将其聚合并发送回。这将节省性能,因为大型呼叫比许多小型呼叫更便宜


我们在我参与的一个项目中做到了这一点,效果非常好。它还整合了js端的逻辑,使其不会由于所有异步回调而分散开来。

除了这将确保您在地狱中的位置之外,您应该先定义一个
a
,或者检查一个辅助变量,因为回调响应可能仍然是
null
,循环永远不会结束。我应该补充一点,这段代码不应该用于任何u