代码之家  ›  专栏  ›  技术社区  ›  Steve

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

  •  0
  • Steve  · 技术社区  · 15 年前

    假设有一个javascript函数调用web服务方法。使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; }
    );
    
    6 回复  |  直到 13 年前
        1
  •  2
  •   Nick Craver    15 年前

    因为您使用的是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);
      }
    });
    
        2
  •  1
  •   T.J. Crowder    15 年前

    实际上,你不能,但是你可以把这个函数分成“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 将在之前返回 callback 被称为 . 异步调用无法阻止这种情况,因此如果希望让函数返回某些内容,则必须重构(或使用同步调用,但这是一个非常糟糕的主意)。重构将涉及调用 提供回调并期望以这种方式提供结果,而不是作为返回值。

        3
  •  1
  •   treznik    15 年前

    你要做的就是模拟 sleep 命令,所以您的脚本“等待”您的ajax请求?但这真的没有道理。这就是为什么您必须首先回调,以便在请求返回答复后继续流,因为您无法预测其响应时间。

        4
  •  1
  •   Ben Zotto sberry    15 年前

    不是陈词滥调,但你不能从异步中创建同步,只能反过来。您需要设计您的代码以允许这样做,这通常意味着在整个调用链中都有回调。

    有一个特殊的异常,那就是您可以在原始xmlhttprequest的'open'方法的异步参数上指定'false',这将导致 send 方法来阻止,直到完成为止。但这可能与某些框架不兼容,而且相当不灵活。大多数js都是异步的。

        5
  •  1
  •   Romain Hippeau    15 年前

    你不应该那样做。从回调点继续处理。 如果调用不返回,则可能会完全挂断浏览器。

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

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

        6
  •  0
  •   coolnalu    15 年前

    我唯一能想到的是

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

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