【问题标题】:Synchronous flow in loops in nodejsnodejs中循环中的同步流
【发布时间】:2012-11-24 19:13:58
【问题描述】:

我有以下代码用于在 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 中做到这一点?

【问题讨论】:

  • 那么,你想阻止prompt.get(我假设这是一个异步函数)?
  • @tjameson 是的,有没有办法做到这一点或更好的方法?

标签: node.js prompt


【解决方案1】:

完全披露,我个人认识futures的作者。

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

例如,要将同步 for 循环转换为异步 for 循环(以便使用异步 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-style console.log

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

这在节点中有效,但在浏览器中无效。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-13
      • 2019-02-15
      • 1970-01-01
      • 2018-07-09
      • 2020-05-31
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多