【问题标题】:Node.js for loopNode.js for 循环
【发布时间】:2017-12-11 05:17:51
【问题描述】:

我正在开发一个机器人,它会提出一系列问题。在我的代码中,第一个问题被打印 5 次(因为数组中有 5 个名称),然后再转到下一个问题。我想做的是在数组中打印第一个带有名字的问题,然后转到下一个问题。我该怎么办?

 var members = list.members;

  for (var i = 0; i < members.length; i++) {
      console.log('actual person - ' + members[i].name);
      yesterday = function(res, convo) {
        convo.ask("You're up " + members[i].name + '. What did you do yesterday?', function(res, convo){
          today(res, convo);
          convo.next();
        });
      }
      today = function(res, convo){
        convo.ask('What do you plan on doing today?', function(res, convo){
          block(res, convo);
          convo.next();
        });
      }
      block = function(res, convo){
        convo.ask('Is there anything standing your way?', function(res, convo) {
          convo.next();
        });
      }
      bot.startConversation(message, yesterday);
    }

【问题讨论】:

    标签: javascript arrays node.js for-loop


    【解决方案1】:

    for 循环在这种情况下将不起作用,因为您有异步回调。所以你实际上开始了 5 个对话,然后才调用回调。

    也不应该多次定义您的函数。

    我不知道 API,但我建议在您的函数中添加另一个参数(i,当前成员编号),并链接回下一个对话(在第三个函数执行时提供 i+1 . 像这样的:

    var members = list.members;
    
    function yesterday(i, res, convo) {
        if (i >= members.length) return; // end
        console.log('actual person - ' + members[i].name);
        convo.ask("You're up " + members[i].name + '. What did you do yesterday?', function(res, convo){
            today(i, res, convo);
            convo.next();
        });
    }
    
    function today(i, res, convo){
        convo.ask('What do you plan on doing today?', function(res, convo){
            block(i, res, convo);
            convo.next();
        });
    }
    
    function block(i, res, convo){
        convo.ask('Is there anything standing your way?', function(res, convo) {
            // Start next conversation...
            yesterday(i+1, res, convo);
            convo.next();
            // Or, alternatively:
            // bot.startConversation(message, yesterday.bind(null, i+1));
        });
    }
    
    bot.startConversation(message, yesterday.bind(null, 0));
    

    【讨论】:

    • 我已尝试实现您的代码,但出现错误。类型错误:cb 不是函数。
    • 这段代码中没有提到cb。你可能没有正确实现它?
    • 我明白了。问题在于startConversation 的额外参数。我更改了代码,将 i 参数放在第一个参数,并使用 bind 确保它通过。
    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 2015-10-26
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2021-10-18
    • 2016-02-22
    相关资源
    最近更新 更多