Javascript NodeJS-如何使forEach和for循环函数连续 server.queue.forEach(函数(q){ YTDL.getInfo(q,(错误,信息)=>{ 控制台日志(信息[“标题]); message.reply(“'”+info[“title”]+'”); }); }); 对于(var i=0;i{ 控制台日志(信息[“标题]); message.reply(“'”+info[“title”]+'”); }); }
我正在使用Node.js为VoIP创建一个名为Discord的音乐机器人,每当上面的任何一个循环执行时,它们都会以随机顺序打印。如何使它们按顺序打印(server.queue[0]、server.queue[1]、server.queue[2]…)?Javascript NodeJS-如何使forEach和for循环函数连续 server.queue.forEach(函数(q){ YTDL.getInfo(q,(错误,信息)=>{ 控制台日志(信息[“标题]); message.reply(“'”+info[“title”]+'”); }); }); 对于(var i=0;i{ 控制台日志(信息[“标题]); message.reply(“'”+info[“title”]+'”); }); },javascript,node.js,youtube,bots,discord,Javascript,Node.js,Youtube,Bots,Discord,我正在使用Node.js为VoIP创建一个名为Discord的音乐机器人,每当上面的任何一个循环执行时,它们都会以随机顺序打印。如何使它们按顺序打印(server.queue[0]、server.queue[1]、server.queue[2]…)? YTDL是一个名为YTDL-core的软件包,可下载YouTube视频,并使用视频链接显示视频标题等信息服务器。队列是一组YouTube视频链接。简单地说: 1) 安装:npmi——异步保存 2) 以及守则: server.queue.forEac
YTDL
是一个名为YTDL-core的软件包,可下载YouTube视频,并使用视频链接显示视频标题等信息<代码>服务器。队列是一组YouTube视频链接。简单地说:
1) 安装:npmi——异步保存
2) 以及守则:
server.queue.forEach(function(q) {
YTDL.getInfo(q, (error, info) => {
console.log(info["title"]);
message.reply('"' + info["title"] + '"');
});
});
for (var i = 0; i < server.queue.length; i++) {
YTDL.getInfo(server.queue[i], (error, info) => {
console.log(info["title"]);
message.reply('"' + info["title"] + '"');
});
}
for..loop
不是异步的好解决方案-它将调用它们并运行for loop之后的下一个语句如果您不想使用async
库,您可以使用Promise。所有的都是这样的
const async = require('async');
async.eachSeries(
server.queue,
(q, next) => {
YTDL.getInfo(q, (error, info) => {
console.log(info["title"]);
message.reply('"' + info["title"] + '"');
next();
});
}
});
const youtubeData=[];
对于(var i=0;i{
//这些值将按调用顺序排列。
});
请注意,Promise.all
将在一个请求失败时等待所有查询完成或拒绝所有查询。查看您的用例并相应地选择
根据库,如果不提供回调,它将返回promise
ytdl.getInfo(url,[选项],[回调(错误,信息)])
如果您只想从视频中获取元信息,请使用此选项。如果回调
没有给予,回报一个承诺
为了找到最好的解决方案,我花了一段时间与这个问题作斗争,直到我发现了ECMA6中内置的yield
特性。因此,使用gen run
库,您可以执行以下操作:
const youtubeData = [];
for (var i = 0; i < server.queue.length; i++) {
youtubeData.push(YTDL.getInfo(server.queue[i]));
}
Promise.all(youtubeData).then((values) => {
// These values will be in the order in which they are called.
});
0 1000 2000它将在for循环后打印
let run = require('gen-run');
function notSequential(){
for (let i = 0; i < 3; i++)
f(i * 1000);
console.log("it won't print after for loop");
}
function sequential(){
run(function*(){
for (let i = 0; i < 3; i++)
yield changedF(i * 1000);
console.log("it will print after for loop");
});
}
function f(time) {
setTimeout(function(){
console.log(time);
}, time);
}
function changedF(time) {
return function (callback) {
setTimeout(function(){
console.log(time);
callback();
}, time);
}
}
notSequential();
sequential();