首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数/事件,当多个javascript远程处理函数完成时

函数/事件,当多个javascript远程处理函数完成时
EN

Stack Overflow用户
提问于 2012-08-30 22:36:53
回答 2查看 1.7K关注 0票数 0

我正在开发一个基于HTML5的SalesForce移动网络应用程序。我们大量使用JavaScript远程处理函数,我想知道如何等待这些远程函数调用中的N(多个)完成,然后触发另一个事件或函数调用。我们试图完成的用例如下:

  1. 用jQuery ()显示$.mobile.showPageLoadingMsg旋转器/装载机;
  2. 调用远程函数1,2,3,.,N.
  3. 等待远程函数1、2、3、.、N返回,但不要冻结浏览器。
  4. 用jQuery ()隐藏$.mobile.hidePageLoadingMsg旋转器/装载机; //在等待远程请求完成时显示加载旋转器。$.mobile.showPageLoadingMsg();//远程请求1 MyController.f1(函数(结果、事件){ if(event.type == 'exception') ){告警(‘Error:’+ event.message);} {/在这里做一些事情,例如填写来自f1 }}的结果的表单,{event.type:true});//远程请求2 MyController.f2(函数(结果、事件){ if(event.type == 'exception') ){警报(‘Error:’+ event.message);} {/在这里做一些事情,例如填写来自f2 }}的结果的表单,{ the :true});// . //远程请求N MyController.fN(函数(结果、事件){ if(event.type == 'exception') ){告警(‘Error:’+ event.message);} {/在这里做一些事情,例如填写来自fN }的结果的表单,{转义:真};//我想等到完成所有请求后才隐藏加载旋转器。wait_for_all();$.mobile.hidePageLoadingMsg();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-30 23:15:14

以下是我通常如何处理这个案件:

代码语言:javascript
运行
复制
    function doManyAsync(doneCallback) {
        // Async worker counters
        var workers = 0;

        function tickWorkers() {
            workers--;
            if ( workers === 0 ) {
                if ( doneCallback )
                    doneCallback();
            }

        }

        // Queue off first one
        doAsyncFunc1(1,2,3, tickWorkers);
        workers++;

        // Queue off second
        doAsyncFunc2(function() {
            tickWorkers();
        });
        workers++;
        
    }

异步工作者计数器在异步函数的作用域之外使用,以跟踪它们。对于启动的每个异步函数,增加计数器。当它们完成时,回调将减少,直到它们全部完成,并调用已完成的回调。这依赖于每个函数的增量。如果异步函数有失败的风险,那么您可以设置一个超时,以不时检查工作人员计数,如果超过阈值而不是0,则会按需要失败或生成错误。

下面是代码的外观:

代码语言:javascript
运行
复制
    function doManyAsync(doneCallback) {

        // Async worker counters
        var workers = 0;

        function tickWorkers() {
            workers--;
            if ( workers === 0 ) {
                if ( doneCallback )
                    doneCallback();
            }

        }

        // Remote Request 1
        MyController.f1(
            function(result, event){
                tickWorkers();
                if(event.type == 'exception') {
                    alert('Error: ' + event.message);                     
                } else {
                    // Do stuff here such as fill in a form with the results from f1
                }
            },
            {escape:true});
        workers++;

        // Remote Request 2
        MyController.f2(
            function(result, event){
                tickWorkers();
                if(event.type == 'exception') {
                    alert('Error: ' + event.message);                     
                } else {
                    // Do stuff here such as fill in a form with the results from f2
                }
            },
            {escape:true});
        workers++;

        // ...

        // Remote Request N
        MyController.fN(
            function(result, event){
                tickWorkers();
                if(event.type == 'exception') {
                    alert('Error: ' + event.message);                     
                } else {
                    // Do stuff here such as fill in a form with the results from fN
                }
            },
            {escape:true});
        workers++;

    }

    // You would then
    $.mobile.showPageLoadingMsg();
    doManyAsync(function() {
        $.mobile.hidePageLoadingMsg();
    })
票数 2
EN

Stack Overflow用户

发布于 2012-08-30 23:20:12

当jQuery和完成函数时,尝试使用。

代码语言:javascript
运行
复制
$.when(asyncFunc1, asyncFunc2).done(yourCallbackHere)

这样,当第一个子句中的所有操作都完成时,就会调用回调函数。

您还可以将done替换为然后,无论提供的延迟对象是解析还是拒绝,都将调用您的回调。

这是一个你可以尝试的简单例子:

代码语言:javascript
运行
复制
// Remote Request 1
MyController.f1(
  function(result, event){
    var dfr = $.Deferred(); // New deferred object.
    if(event.type == 'exception') {
        dfr.reject(); // Error, object should be rejected.
    } else {
        // Do stuff here such as fill in a form with the results from f1
        dfr.resolve(); // Success, object is resolved.
    }
    return dfr; // Return the deferred object.
});

可以理解,f1函数可能不会返回与内部回调dfr相同的结果。如果是这样的话,现在看来,这是可信的:

代码语言:javascript
运行
复制
$when(MyController.f1).done(successCallback); // Callback only if resolved.
$when(MyController.f2).then(alwaysCallback); // Callback if resolved or rejected.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12206569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档