NodeJS循环遍历数组并提示

时间:2017-03-03 11:12:13

标签: arrays node.js sequence prompt

我有一系列要删除的值,但希望用户确认他要删除该值。我计划使用提示节点模块,但不知道如何组合它们,以便在用户确认(或不删除)当前值后移动到数组中的下一个值。简而言之,以下代码不起作用:

        var arr = ["1","2","3"];
    for (var i in arr) {
      console.log("Delete " + arr[i] + "?");
      prompt.get(['response'], function (err, result) {
        console.log('  reponse: ' + result.response);
        // if ...
      });
    }

有什么想法吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

您的代码无效,因为您尝试在同步循环prompt.get中使用异步调用for
如果你必须进行异步调用,你应该等待它的回调。在你的情况下,你可以使用像

这样的东西
function removeEl(idx, arr, done){
  if(idx>=arr.length) return done(arr);
  prompt.get(['response'], function (err, result) {
    console.log('  reponse: ' + result.response);
    if(/*user said yes*/){
      arr.splice(idx, 1);
      removeEl(idx, arr, done)
    }else{
      removeEl(idx+1,arr, done)
    }
  });
}

function removeWithPrompt(arr, done){
  removeEl(0, arr, done);
}

removeWithPrompt([1,2,3], function (modified) {
  // modified contains non-deleted elements
})

或使用像async.each

这样的异步循环

答案 1 :(得分:0)

@ user1280859关于这个问题是正确的,但也许最好采用提示功能而不是递归或异步循环:

var prompt = require('prompt');
prompt.start();
var arr = ["1","2","3"];
var promptArr = arr.map(function(num) {
  return "Delete " + num + "?";
});

prompt.get(promptArr, function (err, result) {
        console.log(result);
      });

OutPut:

prompt: Delete 1?:  y
prompt: Delete 2?:  n
prompt: Delete 3?:  y
{ 'Delete 1?': 'y', 'Delete 2?': 'n', 'Delete 3?': 'y' }