0

想象一下在 Node.js 中实现 fdupes 类型的场景。这似乎是不可能的。人们对此有何建议?

以 npm 上的“提示”模块为例。这大致是我的代码的样子:

for(var i = 0; i < 50; i++) {
  log('shit up console with lots of messy and space-consuming output, pushing everything else off the screen.');
  prompt.get('foo', function(err, resp){
    doSomethingWith(resp.foo);
  });
}

在用户甚至有时间输入他们的第一个响应之前,50 多组输出已经挤满了他们需要在屏幕上做出关于他们的第二个响应的决定的信息。

这似乎是节点过于时髦的同步噱头的重大失败,不是吗?我错过了什么吗?

4

2 回答 2

2

这是另一种情况,您不能(总是)应用您在使用严格同步的语言进行编程时使用的相同类型的编码模式。

在 Node 中解决问题的一种方法:

function showPrompt( i ) {
    log('fill console with lots of messy and space-consuming output, pushing everything else off the screen.');
    prompt.get('foo', function(err, resp) {
        doSomethingWith(resp.foo);
        if( i < 50 ) {
            showPrompt( i + 1 );
        }
    });
}

showPrompt( 0 );
于 2013-11-08T13:10:52.843 回答
2

如果你想循环一些异步函数,你应该尝试使用 async's timesSeries,它将一个函数连续应用 n 次。如果任何函数返回错误,将调用主错误处理程序。

这是一个示例,使用您的代码:

var async = require('async');
async.timesSeries(50, function (n, next) {
  prompt.get('foo', function  (err, res) {
    var value = doSomethingWith(resp.foo);
    if (value !== 'bar') next(new Error('value !== bar'));
    else next(null, value); 
  }
}, function (err, res) {
  // err !== null
  // or res is an array with 50 elements
});
于 2013-11-08T13:20:16.560 回答