내 문제는 아래 보이는 것처럼 코드가 순서대로 실행되지 않는 것입니다.이 코드는 순서대로 실행되지 않는 것 같습니다.
이 코드는 내가 만들고있는 제 discord.js bot 용입니다.
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;
, 내가 봇 처리 할 수있는 명령에 대한 객체를 가지고 있고, 내가 실행하는 기능을 갖는 것을 명령 메시지를받을 때. 코드 전체에서 3 개의 console.log를 1, 2 및 3과 함께 배치하여 코드의 일부가 실행될 것으로 예상되는 순서를 보여줍니다. 코드가 실행되고 쿼리가 발견되면 출력은 다음과 같습니다.
이렇게하면 코드가 잘못된 순서로 실행되고 있음을 알 수 있습니다.
모든 도움은 매우 매우 감사합니다 :)
* 업데이트! 왜 그것이 작동하지 않는지 이해해 주셔서 대단히 감사합니다. 내가 주 파일에서 vidid = youtubetest.respond(query, msg)
에있는 해결책을 찾았는데, 함수가 완료 될 때까지 변수가 할당되지 않으므로 변수없이 내 코드의 나머지 부분으로 넘어갑니다. 단순히 변수 정의되지 않은 경우 경우 확인하고이 정의 될 때까지 기다리는 if
문을 넣어 해결하려면. *
비동기 코드를 작성하고 있습니다. console.log 2는 비동기 함수 밖에 있습니다. 네가 무슨 일이 일어날 지 모르겠다. – Erik
미안하지만, 나는 그런 종류의 일을 많이하지 않았고, 나는 10 대이고 여전히 자바 스크립트를 배우고 있습니다. 비동기를 정확히 의미하는 것은 무엇이며, 어떤 부분이 있고 그렇지 않은지? –
'this.youtube.search'는 아마도 비동기 함수입니다. 즉, 함수의 * 콜백 * 외부에있는 다른 코드가 계속 실행되는 동안 백그라운드에서 무언가를 수행한다는 의미입니다. 그래서 당신의'function (error, result) {...}'는 검색 연산이 완료된 후에 * 만 실행하는 콜백입니다. 따라서'console.log (2)'는 당연히 콜백 전에 호출된다. – Fissio