Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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 等待循环完成,然后从中获取数据_Javascript_Node.js_Json_For Loop - Fatal编程技术网

Javascript 等待循环完成,然后从中获取数据

Javascript 等待循环完成,然后从中获取数据,javascript,node.js,json,for-loop,Javascript,Node.js,Json,For Loop,我正在制作discord bot,在其中我必须通过JSON数据进行循环。这很好,但是我想将数据粘贴到Hastebin const emails=require(“../../json/emails.json”); const hastebin=需要(“hastebin gen”); 用于(电子邮件中的var obj){ if(emails.hasOwnProperty(obj)){ 用于(电子邮件[obj]中的var prop){ 如果(电子邮件[obj].hasOwnProperty(prop

我正在制作discord bot,在其中我必须通过JSON数据进行循环。这很好,但是我想将数据粘贴到Hastebin

const emails=require(“../../json/emails.json”);
const hastebin=需要(“hastebin gen”);
用于(电子邮件中的var obj){
if(emails.hasOwnProperty(obj)){
用于(电子邮件[obj]中的var prop){
如果(电子邮件[obj].hasOwnProperty(prop)){
var结果=电子邮件[obj][“电子邮件”]
}
}
}
var haste=wait hastebin(结果,{扩展名:“txt”});
}
console.log(haste)
JSON

正如你所看到的,我有两封JSON格式的电子邮件,因此它创建了两个hastebin链接,其中始终只有一封电子邮件

编辑
我没有说问题出在哪里。我只想记录一个包含所有电子邮件的Hastebin url。不是2个Hastebin URL,每个URL只有1封电子邮件。

您需要将所有承诺推送到一个数组中,然后使用等待所有承诺兑现或拒绝:

const emails = require("../../json/emails.json");
const hastebin = require("hastebin-gen");

const promises = Object.values(emails).map(({ email }) => hastebin(email, { extension: "txt" }));
const results = await Promise.allSettled(promises);

console.log(results);
根据您的评论,如果要生成单个Hastebin,则应将
Hastebin
调用移动到
for
循环之后,并将所有
结果传递给它:

const emails = require("../../json/emails.json");
const hastebin = require("hastebin-gen");

const content = Object.values(emails).map(({ email }) => email).join('\n');
const results = await hastebin(content, { extension: "txt" });

console.log(results);

如果我理解正确,您希望将所有电子邮件放在一个文件中,而不是为每个文件创建链接。纠正这种情况的方法是理解它为什么这样做

让我们首先看看创建链接的位置(您的hasebin()调用),它位于for循环内。你们需要将它移出你们的循环,但你们仍然希望在你们的循环中创建一个你们希望添加到hastebin的电子邮件数组

根据您的标题,您理解了这一点-听起来您对javascripts异步性质有问题,因为您在循环外部的调用不会等待循环完成,因此它在数组中还没有任何数据

为了在Javascript中实现这一点,我们使用了一种称为“回调”的方法

请参见此示例:

function functionOne(callbackFunction) {
    console.log("1");
    callbackFunction(); 
}

function onComplete() {
    console.log("2");
}

functionOne(onComplete);
上面的代码将使用引用onComplete方法的参数调用functionOne。functionOne运行(1打印到控制台),然后通过callbackFunction()调用onComplete,2打印到控制台


那么,这对你来说意味着什么呢?您的循环应该运行,然后有一个回调,您可以在那里创建hastebin,这将确保您的循环在尝试上载数据之前完成了构建/获取数据。

好吧,您的代码中只有一个
var haste
。也许您想在数组中收集结果?或者只是在每次迭代期间记录
haste
,而不是在循环之后?感谢您的解释!我现在明白了。但我已经选择了另一个答案作为解决方案。但再次非常感谢!我不知道我是否可以选择两个答案作为解决方案,所以你没有提到如何在每个函数之间传输数据。是的,我想等到循环结束,这样所有的电子邮件都可以通过一个Hastebin链接发送。找出这个仍然代码仍然会记录每一个新的Hastebin更新。必须取消标记作为解决方案。@TXSHRO不知道你的意思。一旦所有承诺得到履行或拒绝,此代码将记录单个结果数组。这个数组显然会为每个承诺(每个对hastebin的调用)包含一个条目。我正在努力实现的目标是输出所有电子邮件的Hastebin url。我还必须将循环中的“results”重命名为“EmailResults”,因为results var已经明确声明了,这就是我所说的。如果你想要一个单独的Hastebin,那么你应该将
Hastebin
调用移到
for
循环之外,只调用它一次,并将所有的
结果
串联传递给它。现在尝试了第二次,我收到了“emails.map不是函数”错误?我很困惑,露尔。我现在也编辑了这个问题。
function functionOne(callbackFunction) {
    console.log("1");
    callbackFunction(); 
}

function onComplete() {
    console.log("2");
}

functionOne(onComplete);