Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

Javascript NodeJS-如何使forEach和for循环函数连续 server.queue.forEach(函数(q){ YTDL.getInfo(q,(错误,信息)=>{ 控制台日志(信息[“标题]); message.reply(“'”+info[“title”]+'”); }); }); 对于(var i=0;i{ 控制台日志(信息[“标题]); message.reply(“'”+info[“title”]+'”); }); }

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

我正在使用Node.js为VoIP创建一个名为Discord的音乐机器人,每当上面的任何一个循环执行时,它们都会以随机顺序打印。如何使它们按顺序打印(server.queue[0]、server.queue[1]、server.queue[2]…)?
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();