[英]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,还将setTimeout
与0
时间始终等待到父线程结束为止:
重要的是要注意,在调用setTimeout()的线程终止之前,函数或代码段无法执行。
因此,这就是为什么所有“开始”都在“结束”之前的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.