1

我有以下代码用于在 nodejs 中接受来自命令行的输入

for(i=0; i<2;i++)
{
    for(j=0; j<2; j++)
    {
        console.log("Enter data for "+i+"th row and "+j+"th column");
        prompt.get(['var1', 'var2'], function (error, result) {
             console.log("var1 is "+result.var1);
             console.log("var2 is "+result.var2);
        });
    }
}

我得到的输出为

Enter data for 0th row and 0th column
prompt: var1:  
Enter data for 0th row and 1th column
prompt: var1:  
Enter data for 1th row and 0th column
prompt: var1:
Enter data for 1th row and 1th column
prompt: var1:

如您所见,第一个迭代器的 var1 和 var2 的流程正在同步,但在第一个迭代器的 var2 和第二个迭代器的 var1 之间不同步

我需要以下输出序列,其中第一个迭代器的 var2 和第二个迭代器的 var1 也是同步的,依此类推。

Enter data for 0th row and 0th column
prompt: var1:  10
prompt: var2:  100
Enter data for 0th row and 1th column
prompt: var1:  20
prompt: var2:  100
Enter data for 1th row and 0th column
prompt: var1:  30
prompt: var2:  100
Enter data for 1th row and 1th column
prompt: var1:  40
prompt: var2:  100

有没有办法在 nodejs 中做到这一点?

4

2 回答 2

1

完全披露,我个人认识futures.

看看futuresasync。就个人而言,对于某些事情,我更喜欢期货的风格。

例如,要将您的同步 for 循环转换为异步 for 循环(以便使用 asynchronous prompt.get),请尝试以下操作:

var forEachAsync = require('forEachAsync');

forEachAsync([0, 1], function (next, _, i) {
    forEachAsync([0, 1], function (next, _, j) {
        console.log("Enter data for "+i+"th row and "+j+"th column");
        prompt.get(['var1', 'var2'], function (error, result) {
            console.log("var1 is "+result.var1);
            console.log("var2 is "+result.var2);
            next();
        });
    }).then(next);
});

futures, next 是当您准备好循环中的下一次迭代时调用的回调。我们创建了一个嵌套的异步 forEach。内部 forEach 完成时外部 forEach 继续,调用提示回调时内部 forEach 继续。

回调的签名与 的签名相同Array.prototype.forEach,只是它添加了一个回调作为第一个参数。

编辑:

不相关,但考虑使用printf 风格的 console.log

console.log("Enter data for %dth row and %jth column", i, j);

这适用于节点,但不适用于浏览器。

于 2012-11-24T19:30:29.000 回答
0

您可以了解 Flow Control 的基础知识并实现自己的系列功能,如 Mixus 在线书籍中所述。我发现它对 Nodejs 异步初学者非常有用。书籍:http ://book.mixu.net/node/single.html 章节:7 控制流

于 2013-12-24T02:46:54.207 回答