【问题标题】:NodeJS looping through an array and promptNodeJS循环遍历数组并提示
【发布时间】:2017-03-03 11:12:13
【问题描述】:

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

        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 ...
      });
    }

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

【问题讨论】:

  • 你的项目是完全只用 nodeJS 做的,还是你有一些前端设计,和 js 或 js 框架一起工作?
  • 为什么这不起作用?

标签: arrays node.js sequence prompt


【解决方案1】:

@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);
      });

输出:

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

【讨论】:

    【解决方案2】:

    您的代码无法正常工作,因为您试图在同步循环 for 中使用异步调用 prompt.get
    如果你必须进行异步调用,你应该等待它的回调。特别是在您的情况下,您可以使用类似

    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这样的异步循环

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多