【发布时间】:2020-11-22 22:57:52
【问题描述】:
我正在使用 Discord.js,但我不知道如何从 Promise 中获取价值。这是一些上下文:
///File: commands/mail.js///
module.exports = {
name: 'mail',
description: 'A system of collecting, sending, and receiving mail',
async execute(client,message, args) {
const fs = require('fs');
...
...
switch(args[0]){
...
case "check":
...
var name;
var val;
/* [object Promise]--> */ var out = client.users.fetch(recipient.senders[i]);
client.users.fetch(recipient.senders[i]).then((name)=>{
console.log("name.username(inside): "+name.username);
val = name.username;
return (name);
});
console.log("name(outside): ",name);
console.log("out: ",out);
console.log("out.username: ",out.username);
console.log("val: ",val);
/* next line will get an error saying name.username is undefined */
//console.log("name.username(outside): "+name.username);
...
我得到了输出:
name(outside): undefined
out: Promise {
User {
id: '1456051390970320640',
bot: false,
username: 'Sir_Ross',
discriminator: '3871',
avatar: 'a956037b05108e4971b93f3ffde97b6c',
lastMessageID: '739552900342349856',
lastMessageChannelID: '739150130339340342',
flags: UserFlags { bitfield: 0 }
}
}
val: undefined
out.username: undefined
name.username(inside): Sir_Ross
我的问题是我显然可以获取我的用户名并将其打印到控制台,但我无法将其从 Promise 中取出。如何从 Promise 中获取价值,以便我可以在其他地方使用它?
完整代码:
module.exports = {
name: 'mail',
description: 'A system of collecting, sending, and receiving mail',
async execute(client,message, args) {
const fs = require('fs');
var path;
if(!args.length){
//No Arguments
return 0;
}
switch(args[0]){
case "send":
// Send Mail
if(args.length<3){
message.reply('Invalid Arguments: !mail send <recipient_id> <message>');
}else{
letter = "";
spaces = 0;
for(i = 0; i<message.content.length;i++){
if(spaces<3){
if(message.content[i]===' '){
spaces++;
}
continue;
}else{
letter+=message.content[i];
}
}
const fs = require('fs');
path = 'mail/';
path+=args[1].substring(3,21);
sender = message.author.id;
path+='.json';
console.log(path);
if(!fs.existsSync(path)){
user = {
user_id: args[1].substring(3,21),
//username: message.author.username,
mailbox: [letter],
senders: [sender],
//status: { 0 },
status: ['0'],
};
data = JSON.stringify(user);
fs.writeFileSync(path,data);
}else{
var recipient;
fs.readFile(path,(err,data) =>{
if(err) throw err;
recipient=JSON.parse(data);
//console.log(recipient);
recipient.mailbox.push(letter);
recipient.senders.push(message.author.id);
recipient.status.push('0');
console.log(recipient);
fs.writeFileSync(path,JSON.stringify(recipient));
});
}
}
break;
case "check":
// Check Inbox
const fs = require('fs');
path = 'mail/';
path+=message.author.id;
// sender = message.author.id;
path+='.json';
if(!fs.existsSync(path)){
message.reply("Mailbox does not yet exist! You need to receive mail first!");
return;
//break;
}else{
var recipient;
fs.readFile(path,(err,data) =>{
if(err) throw err;
recipient=JSON.parse(data);
if(!recipient.senders.length){
message.reply("Mailbox is empty!");
return;
//break;
}else{
outText = "";
for(i = 0; i<recipient.senders.length;i++){
if(recipient.status[i]==='0')outText+="**";
outText+=i+1;
outText+=". ";
//console.log("Promise: ",client.users.fetch(recipient.senders[i]));
var name;
var val;
var out = client.users.fetch(recipient.senders[i]);
client.users.fetch(recipient.senders[i]).then((name)=>{
console.log("name.username(inside): "+name.username);
val = name.username;
return (name);
});
console.log("name(outside): ",name);
console.log("out: ",out);
console.log("out.username: ",out.username);
console.log("val: ",val);
/* name.username is undefined */
//console.log("name.username(outside): "+name.username);
// esc = returnVal();
outText+=val;
if(recipient.status[i]==='0')outText+="**";
outText+='\n';
}
message.reply(outText);
}
});
}
break;
case "read":
// Read Mail
break;
case "delete":
// Delete Mail
break;
case "markRead":
// Mark a Message as Read
break;
case "markUnread":
// Mark a Message as Unread
break;
case "forward":
// Forward a message
break;
}
},
};
【问题讨论】:
-
只要
await它,因为你在async函数中? -
@Bergi 问题是你需要在
async函数中创建一个await,它说我不再在async函数中 -
那么请分享您的实际代码,因为从您发布的内容来看,您的问题发生在
async execute(client,message, args) {方法中。 -
啊,你在
fs.readFile回调中。不要那样做 - promisify thereadFilemethod 并写const data = await readFileAsync(path); const recipient = JSON.parse(data); …这样你的fetch调用仍然在execute内。 -
@Bergi 我搞定了,非常感谢!
标签: javascript node.js promise async-await discord.js