2013-06-18 18 views
0

我正在使用node.js如何在下次调用之前重复调用某个函数并等待完成?

我有一个函数,我需要在一个循环内调用几个参数。该函数必须用循环迭代器作为参数调用,并且循环在调用完成之前不能再次调用该函数。

像这样(同步方法): (注意someFunc是一个异步函数)

var totCount = 1000; 
for (var x = 0 ; x < totCount ; x++) { 
    someFunc(x, parm2, parm3, parm4); 
} 

我明白,在节点,someFunc可以以任意顺序执行,但这种情况下,绝对必须执行x = 0然后1然后2等

似乎异步库调用“异步”,而“将做到这一点,但我无法将该示例翻译成我的现实生活中的代码。

这里是的例子“async.whilst”

var count = 0; 

async.whilst(
    function() { return count < 5; }, 
    function (callback) { 
     count++; 
     setTimeout(callback, 1000); 
    }, 
    function (err) { 
     // 5 seconds have passed 
    } 
); 

注意,因为我可能不得不调用函数someFunc很多次,正常回调的做法是行不通的。

如何将其转换为我的代码? (我假设“async.whilst”是正确的方法,如果不是,请指定正确的方法)

+0

someFunc是同步还是可以提供一个回调作为它完成时调用的参数? –

+0

如果someFunc不是异步的,它将不会以任何顺序执行,而是按照函数被调用的顺序执行。 –

+0

someFunc是异步的。我会在所有参数后追加回调参数吗? – SeanDav

回答

1

以下示例将假定someFunc是异步并将回调作为最后一个参数。它是否取决于实施方式。如果它是另一个库的一部分,它可能会这样做。

var count = 0; 
var totCount = 1000; 

async.whilst(
    function() { return count < totCount; }, 
    function (callback) { 
    someFunc(count, parm2, parm3, parm4, callback); 
    count++; 
    }, 
    function (err) { 
     // someFunc has been called totCount times, or an error has occured 
    } 
); 

如果someFunc不是异步但你要异步运行的循环,避免阻塞,你只需调用函数调用后回调。

//... 
    function (callback) { 
    someFunc(x, parm2, parm3, parm4); 
    count++; 
    callback(); 
    }, 
// ... 

更新

又未异步/承诺(未测试):

var count = 0; 
var totCount = 1000; 

function loop() { 
    // Async lets you provide you own check-method 
    if(count >= totCount) { 
    // Async lets you provide your own done-method 
    return done(); 
    } 

    // Async does setImmediate/process.nextTick somewhere around here 
    myFunc(count, param, param, function() { 
    // Async checks for errors here 
    count++; 
    loop(); 
    }); 
} 

function done() { 
    // Async provides any errors here 
    console.log("done"); 
} 

我评论,其中异步做了一些额外的东西,这可能是件好事,(最大约,检查出于特定的源代码,这非常容易阅读)。例如,如果someFunc实际上不是异步的,只是调用一个回调函数,这将会像使用for(...)一样杀死事件循环。

+0

非常感谢 - 现在进行测试。如何在不访问Async或Promises类型库的情况下解决这个问题? – SeanDav

+1

@SeanDav我用不使用异步的例子更新了答案。这其实很简单。如果它是服务器端代码,我没有看到重新发明轮子的意义。 –

+0

我将尝试一些类似的不使用异步的东西,只是为了了解它是如何完成的。您的async.whilst解决方案非常感谢。 – SeanDav

1

听起来像要使用承诺,假设您可以设置someFunc以便它返回承诺。你可以这样做:

var promise=new Promise().fulfill(); 
var totCount = 1000; 
for (var x = 0 ; x < totCount ; x++) { 
    promise=promise.then(function(){return someFunc(x, parm2, parm3, parm4);}); 
} 
promise.then(function(){console.log("done");}); 

确切的语法将取决于您选择使用的承诺库。

+0

感谢你。我在来这里之前确实安装过Q,但决定由于我已经在使用“异步”,我会尝试坚持使用“异步”解决方案。无论如何,试试你的榜样,因为它看起来相当优雅和直接。 – SeanDav

相关问题