如何设置在node.js中运行异步函数的时间限制?

时间:2016-04-13 03:02:19

标签: javascript node.js asynchronous

有一个像这样的异步函数fun(param, callback)

fun(param, function(err){
    if(err) console.log(err);
    doSomething();
});

如何设置运行此功能的时间限制?
例如,我将时间限制设置为等于10秒 如果在10秒内完成,则没有错误 如果它超过10秒,则终止它并显示错误。

3 个答案:

答案 0 :(得分:7)

Promise是这种行为的理想选择,你可以拥有类似的东西:

new Promise(function(resolve, reject){
   asyncFn(param, function(err, result){
        if(error){
          return reject(error);
        }
        return resolve(result)
   });

    setTimeout(function(){reject('timeout')},10000)
}).then(doSomething);

这是使用基本的ES6 Promise实现。但是如果你想要包含像bluebird这样的东西,你可以找到更强大的工具,比如功能或整个模块的承诺和承诺超时。

http://bluebirdjs.com/docs/api/timeout.html

这在我看来是首选方法。 希望这有帮助

答案 1 :(得分:3)

最简单的方法是在promise中捕获函数。

var Promise = require("bluebird");
var elt = new Promise((resolve, reject) => {
   fun(param, (err) => {
     if (err) reject(err);
     doSomething();
     resolve();
});

elt.timeout(1000).then(() => console.log('done'))
                 .catch(Promise.TimeoutError, (e) => console.log("timed out"))

答案 2 :(得分:1)

我制作了一个模块' intelli-timer'

var timer = require('intelli-timer');

timer.countdown(10000, function(timerCallback){  // time limit is 10 second

    do_something_async(err, function(){
        timerCallback();    // timerCallback() after finish
    });

}, function(err){

    if(err) console.log(err);  // err is null when the task is completed in time
    else console.log('success');

});