繁体   English   中英

并行函数javascript,node.js

[英]parallel function javascript, node.js

关于如何解决此“ f”功能的任何想法(paralell),输出nedd看起来

f的活动开始。

f的活动开始。

f的活动开始。

f的活动结束。

f的活动结束。

f的活动结束。

做完了

有时,但并非总是如此,有关如何修复的任何想法(任务是不修改'f'函数)。

谢谢。

function f(cb) {
  console.log("f's activity starts.");
  var t = Math.random() * 500; //gives a num between 0 and 1000

  function onActivityDone() {
    console.log("f's activity ends.");
    if (cb) cb();
  }
  setTimeout(onActivityDone, t);

}

function final() {
  console.log('Done');
}

function first() {
  final();
}



f()
{     
f()
{
    f(first)
  };
};

这看起来有点奇怪

f()
{     
f()
{
    f(first)
  };
};

看来您正在尝试做这样的事情

f(function() {
  f(function() {
    f(first);
  });
});

maček给了您解决问题的答案。

您的代码所做的等同于:

f();
f();
f(first);

花括号只是打开不必要的代码块。

编辑:阅读您的评论后,我想您可能想做这样的事情

function trace (msg)
{
    var d = new Date();
    var h = d.getHours();
    var m = d.getMinutes();
    var s = d.getSeconds();
    console.log (h + ":" + m + ":" + s + " " + msg);
}

var Synchro = new function () {
    this.num_funs = 0;
    this.funs = {};

    this.register = function(fun)
    {
        this.funs[this.num_funs] = fun;
        trace ("activity "+this.num_funs+" registered.");
        this.num_funs++;
    };

    this.start = function()
    {
        console.log("launching "+this.num_funs
            +" activit"+(this.num_funs == 1 ? 'y' : 'es'));

        this.num_active = this.num_funs;
        for (var i in this.funs)
        {
            var t = 2000 + Math.random() * 8000; // delay from 2 to 6 seconds
            setTimeout(onActivityDone, t);
        }

        var _this = this;
        function onActivityDone()
        {
            if (--_this.num_active == 0)
            {
                trace ("all functions complete")
                for (var i in _this.funs) _this.funs[i]();

            }
            else trace ("still "+_this.num_active+" to go");
        }
    };
} ();

function fun1() { trace (' hi from fun1'); }
function fun2() { trace (' hi from fun2'); }
function fun3() { trace (' hi from fun3'); }

Synchro.register (fun1);
Synchro.register (fun2);
Synchro.register (fun3);
Synchro.start();

根据评论,我编辑了答案:

function f(cb) {
    console.log("f's activity starts.");
    var t = Math.random() * 500; //gives a num between 0 and 1000

    function onActivityDone() {
        console.log("f's activity ends.");
        if (cb) cb();
    }
    setTimeout(onActivityDone, t);
}

function final() {
    console.log('Done');
}

var iterations = 1000,
    ended = 0,
    i;

function first() {
    ended++;
    if(ended == iterations) {
        final();
    }
}

for(i = 0; i < iterations; i++) { f(first) }

这个想法是仅在触发第1000个回调时才运行final函数。 根据MDN docs,还将setTimeout0时间始终等待到父线程结束为止:

重要的是要注意,在调用setTimeout()的线程终止之前,函数或代码段无法执行。

因此,这就是为什么所有“开始”都在“结束”之前的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM