3

私の問題は、以下に示すように、コードが順番に実行されていないように見えることです。

このコードは、私が作成している discord.js ボット用です。



    var Discord = require("discord.js");
    var bot = new Discord.Client();
    var yt = require("C:/Users/username/Documents/Coding/Discord/youtubetest.js");
    var youtubetest = new yt();
    var fs = require('fs');
    var youtubedl = require('youtube-dl');
    var prefix = "!";
    var vidid;
    var commands = {
      play: {
       name: "!play ",
       fnc: "Gets a Youtube video matching given tags.",
       process: function(msg, query) {
         youtubetest.respond(query, msg);
         var vidid = youtubetest.vidid;
         console.log(typeof(vidid) + " + " + vidid);
         console.log("3");
       }
     }
    };

    bot.on('ready', () => {
      console.log('I am ready!');
    });

    bot.on("message", msg => {
      if(!msg.content.startsWith(prefix) || msg.author.bot || (msg.author.id === bot.user.id)) return;

      var cmdraw = msg.content.split(" ")[0].substring(1).toLowerCase();
      var query = msg.content.split("!")[1];
      var cmd = commands[cmdraw];
      if (cmd) {
        var res = cmd.process(msg, query, bot);
        if (res) {
          msg.channel.sendMessage(res);
        }
      } else {
        let msgs = [];
        msgs.push(msg.content + " is not a valid command.");
        msgs.push(" ");
        msgs.push("Available commands:");
        msgs.push(" ");
        msg.channel.sendMessage(msgs);
        msg.channel.sendMessage(commands.help.process(msg));
      }
    });

    bot.on('error', e => { console.error(e); });
    bot.login("mytoken");

youtubetest.js ファイル:



    var youtube_node = require('youtube-node');
    var ConfigFile = require("C:/Users/username/Documents/Coding/Discord/json_config.json");
    var mybot = require("C:/Users/username/Documents/Coding/Discord/mybot.js");

    function myyt () {
        this.youtube = new youtube_node();
        this.youtube.setKey(ConfigFile.youtube_api_key);
        this.vidid = "";
    }

    myyt.prototype.respond = function(query, msg) {
      this.youtube.search(query, 1, function(error, result) {
        if (error) {
          msg.channel.sendMessage("There was an error finding requested video.");
        } else {
          vidid = 'http://www.youtube.com/watch?v=' + result.items[0].id.videoId;
          myyt.vidid = vidid;
          console.log("1");
        }
      });
      console.log("2");
    };

    module.exports = myyt;

コードが示すように、ボットが処理できるコマンドのオブジェクトがあり、メッセージを受信したときにそのコマンドを実行する関数があります。コード全体を通して、コードの一部が実行されると予想される順序を示す 1、2、および 3 の 3 つの console.log を配置したことがわかります。コードが実行され、クエリが見つかった場合の出力は次のとおりです。



    I am ready!
    string + 
    2
    3
    1

これは、コードが間違った順序で実行されていることを示しています。

すべてのヘルプは非常に高く評価されています:)

*アップデート!なぜ機能しないのかを理解していただき、ありがとうございます。メインファイルのどこに解決策が見つかりましたかvidid = youtubetest.respond(query, msg)その場合、変数は関数が完了するまで割り当てられないため、変数なしで残りのコードに進みます。修正するには、単にifステートメントは、変数が未定義かどうかをチェックし、定義されるまで待機します。*

4

2 に答える 2

0

JavaScript では、他の関数に渡すコールバック関数は非同期で呼び出されることに注意してください。つまり、コールバック関数の呼び出しは「順番どおりに」発生しない場合があります。この場合の「順序」とは、ソース ファイルに表示される順序を意味します。

コールバック関数は、特定のイベントで単純に呼び出されます。

  • 処理するデータがある場合
  • エラーで
  • あなたの場合、たとえば、YouTube の検索結果の準備ができている場合、「準備完了」イベントが受信されるか、「メッセージ」が受信されます。
于 2016-12-08T09:28:22.490 に答える