并行函数javascript,node.js
有没有关于如何修复这个“f”函数(paralell)的想法,输出nedd的外观 f的活动开始 f的活动开始 f的活动开始 f的活动结束 f的活动结束 f的活动结束 完成了 有时有效,但并不总是,任何关于如何修复的想法(任务是不修改“f”函数) 多谢各位并行函数javascript,node.js,javascript,node.js,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 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);
});
});
马切克给了你问题的答案 您的代码的作用相当于:
f();
f();
f(first);
大括号只是打开不必要的代码块
编辑:在阅读您的评论后,我认为您可能想做:
根据我编辑的答案的评论:
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) }
功能f(cb){
log(“f的活动开始”);
var t=Math.random()*500;//给出一个介于0和1000之间的数值
函数onActivityDone(){
log(“f的活动结束”);
if(cb)cb();
}
设置超时(onActivityDone,t);
}
函数final(){
console.log('Done');
}
var迭代次数=1000,
结束=0,
我
函数优先(){
结束++;
如果(结束==迭代次数){
最后的();
}
}
对于(i=0;i
其思想是仅在触发第1000次回调时运行final
函数。另外,setTimeout
with0
time将始终等待父线程结束-根据MDN文档:
需要注意的是,函数或代码段不能
执行,直到调用setTimeout()的线程终止
这就是为什么所有的“开始”都在“结束”之前。f接受未定义的参数,因此代码实际上可以工作。它根本不符合可能的意图;)是的,代码可以工作,但是打印不同的输出,想法是在同一时间启动所有函数,然后在同一时间结束所有函数,最后打印完成。唯一的问题是我需要在同一时间启动所有函数(3),然后结束所有函数,并在所有函数完成后打印完成。f的活动开始。f的活动开始。f的活动开始。f的活动结束。f的活动结束。f的活动结束。完成。感谢您的代码,我将先尝试理解它,然后尝试修改我的代码。。谢谢,不客气。JSFIDLE非常清楚我的代码是做什么的,但我不确定这是否是您想要的。我在这方面非常新,我只需要打印第一行,f activity start(3次),然后打印f activity end(3次),然后打印Done。试试看,它将显示您期望的消息。在我看来,如果不修改
f
函数,就无法完成此操作。。。如果var t
为0
,则在f
完成执行后立即触发onActivityDone
Math.random()
是随机的,因此您无法控制ActivityOne函数的执行时间,cb
也是如此。唯一知道的是它会在一秒钟内发生。我也是这么想的,但教授说这是可能的,我也会这么做。卡洛斯的可能复制品,谢谢你的帮助,我尝试了你的代码,得到了相同的输出,出于某些原因,有时您的代码和我的代码会在“fs活动结束”之间打印“完成”,其想法是在所有活动完成后打印“完成”。您能否更改最终
和第一次
功能?再次:您能否更改最终
和第一次
功能?
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) }