如何推迟在nodejs中解决任务

时间:2014-04-08 06:53:01

标签: javascript node.js asynchronous

我是nodejs的新手,最近我不知道如何按顺序安排任务,使他们的行为正确。

以下是两个例子

arr.forEach(function(elem){
    //do many many things
});
console.log('done, now take ur pick');
stdin.on('input', function action(){
    ...
})

如何在arr.forEach之后设置stdin.on fire。 和问题2我想如果我做了

fn1();
fn2();

function fn1(){
    //long long code
}

function fn2(){
    console.log('fn2 is done!')
}

并运行上面的命令,执行将在

的线程中

fn1 fn2 fn1 fn1 fn1,对吧?如何防止这种情况?

2 个答案:

答案 0 :(得分:3)

node.js中的函数是同步函数或异步函数。同步代码在单个线程中运行,其行为与您习惯使用的代码完全相同:

fn1();
fn2();
fn3(fn4());

将运行fn1,然后fn2,然后fn4,然后fn3(传递fn4的结果作为参数)。

异步代码会触发某些操作,并将完成后执行的函数作为参数(这可能反过来触发另一个异步操作)。你立即得到控制权。例如:

doSomeAsyncThing(function () {
    console.log("did the async thing");
});
console.log("hello");

执行如下:首先,异步操作被触发,然后"你好"打印出来。一段时间后,异步操作完成,因此调用了回调,并且"做了异步的事情"打印出来。

如果你想做一个异步的事情,然后在第一个完成后做另一个异步的事情,标准的方法是嵌套回调:

async1(function() {
    async2(function() {
        console.log("async1 and async2 finished");
    });
});

虽然therebetter选项。

所以在你的第二个例子中,如果fn1是同步的,它将完全像你编写它一样工作。如果fn1必须异步执行某些操作,那么它也必须是异步的,所以你必须这样写:

function fn1(callback) {
    // do some sync stuff
    doSomethingAsync(function () {
        // do more sync stuff
        doSomethingMoreAsync(function () {
            // do more sync stuff
            callback(); // call the callback once everything is completed
        });
    });
}

然后像这样称呼它

fn1(function () {
    fn2();
});

可以简化为:

fn1(fn2);

在第一个示例中,请注意array.forEach是同步的。如果您的// do many many things都是同步的,那么它将与您编写的完全一致,但如果那里有异步操作,您可以手动实现计数器,或只使用{{3} } library或async

答案 1 :(得分:1)

将stdin添加到forEach函数的回调函数中。像:

arr.forEach(function(elem){
    //do many many things
}, function() {
    console.log('done, now take ur pick');
    stdin.on('input', function action(){
        ...
    });
});

使用它,只有在完成forEach循环后才会调用stdin和console.log函数。