JavaScript:等待特定时间的完成

时间:2016-04-12 16:58:14

标签: javascript multithreading

我是javascript的新手,我有一个忙着等待功能完成的问题。我这里没有代码,但我会很快解释一下:

我有一个功能可以执行100毫秒甚至10秒,我们称之为 Foo1

然后我有另一个函数 Foo2 ,它首先使用输入参数,然后调用Foo1。其中一个输入参数是以毫秒为单位的时间,我想等待函数结束。如果执行超过此限制,只需执行完成过程并返回。如果Foo1在时间超过之前完成,请返回之前

我的解决方案是基本的代码语法,但希望可以理解。

1

// First wait for the specified time and then execute Foo1 - obviously one after another
self.Foo2 (time) {
    setTimeout(self.Foo1(),0);
    var now = new Date().getTime();
    while(new Date().getTime() < now + time){ /* do nothing */ }     
}

2

/*This one, if I understand it well, creates a queue where at first DoWait
is executed, then Foo1 and after that all other DoWait - so practically 
we wait the whole time of execution.*/

var finished = false;
self.DoWait(time, now) {
    if(!finished && (new Date().getTime() < now + time)) {
        setTimeout(self.DoWait(time, now), 20); 
    } else {
        /* finish procedure */
    }
}

self.Foo2 (time) {
    setTimeout(function() { self.Foo1(); finished=true;},0);
    var now = new Date().getTime();
    self.DoWait(time, now)    
}

你知道一些解决方案是如何做到的吗?我读到了 worker ,但是对于创建worker而言,你需要整个新文件中的函数,但我更喜欢在函数/文件中完成的事情。 提前感谢所有答案。

2 个答案:

答案 0 :(得分:0)

听起来只有Promises race才能完成你所追求的目标。

The MDN Docs cover it nicely,但我会在这里复制代码:

var p1 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 500, "one"); 
});
var p2 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 100, "two"); 
});

Promise.race([p1, p2]).then(function(value) {
  console.log(value); // "two"
  // Both resolve, but p2 is faster
});

var p3 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 100, "three");
});
var p4 = new Promise(function(resolve, reject) { 
    setTimeout(reject, 500, "four"); 
});

Promise.race([p3, p4]).then(function(value) {
  console.log(value); // "three"
  // p3 is faster, so it resolves               
}, function(reason) {
  // Not called
});

var p5 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 500, "five"); 
});
var p6 = new Promise(function(resolve, reject) { 
    setTimeout(reject, 100, "six");
});

Promise.race([p5, p6]).then(function(value) {
  // Not called              
}, function(reason) {
  console.log(reason); // "six"
  // p6 is faster, so it rejects
});

答案 1 :(得分:0)

您可以在Foo2内部超时后调用最终程序。您可以将此超时句柄传递给Foo1。如果Foo1更早完成,它可以清除由Foo2创建的超时并调用最终过程本身。

self.Foo2 (time) {
    /* Foo2 stuff */
    //call final procedure after set time
    var timeout = setTimeout(self.finalProcedure, time);
    //pass timout handle to Foo1
    self.Foo1(time, timeout);   
}

self.Foo1 (time, timeout) {
    var before = new Date().getTime();
    /* Foo1 stuff */
    var after = new Date().getTime();
    if((after - before) < time){ //finished earlier
        //clear timeout as Foo1 is done
        clearTimeout(timeout);
        //call final procedure
        self.finalProcedure();
    }
}

self.finalProcedure(){
    /* final steps */
}