我是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,对吧?如何防止这种情况?
答案 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");
});
});
所以在你的第二个例子中,如果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函数。