如何解决如何在异步继续之前等待查询者的答案被fs.writeFile处理
所以我有这个异步函数,其中包含查询器和fs.writeFile
(async () => {
...
if (process.env.IG_USERNAME && process.env.IG_PASSWORD) {
console.log(`Used as ${chalk.green(process.env.IG_USERNAME)}`);
} else {
console.log(`\nInstagram account data is not yet put in \nInputting in...`);
await inquirer.prompt(questions).then((answers) => {
let file = `IG_USERNAME=${answers.username}\nIG_PASSWORD=${answers.password}\n#ONLINE_MODE=true`;
fs.writeFile(".env",file,(err) => {
if (err) console.log("Something went wrong..");
else console.log(`Used as ${chalk.green(process.env.IG_USERNAME)}`);
});
});
}
await login();
...
})();
login();
函数需要.env变量,我使用Inquirer输入了它,但是login();
函数在查询者的答案得到处理之前就已执行。
如何使login();
等待fs.writeFile
完成?
解决方法
简短的答案是仅在.then()
中使用基于诺言的异步操作,以便您可以正确地链接所有诺言,然后更高级别的await
将等待所有事情。在这种情况下,您可以使用return fs.promises.writeFile(...)
(而不是fs.writeFile(...)
),因为fs.promises.writefile(...)
返回一个Promise,然后可以正确地与父Promise链接。
(async () => {
...
if (process.env.IG_USERNAME && process.env.IG_PASSWORD) {
console.log(`Used as ${chalk.green(process.env.IG_USERNAME)}`);
} else {
console.log(`\nInstagram account data is not yet put in \nInputting in...`);
await inquirer.prompt(questions).then((answers) => {
let file = `IG_USERNAME=${answers.username}\nIG_PASSWORD=${answers.password}\n#ONLINE_MODE=true`;
return fs.promises.writeFile(".env",file);
});
}
await login();
...
})();
或者,简化一些:
(async () => {
...
if (process.env.IG_USERNAME && process.env.IG_PASSWORD) {
console.log(`Used as ${chalk.green(process.env.IG_USERNAME)}`);
} else {
console.log(`\nInstagram account data is not yet put in \nInputting in...`);
const answers = await inquirer.prompt(questions);
const file = `IG_USERNAME=${answers.username}\nIG_PASSWORD=${answers.password}\n#ONLINE_MODE=true`;
await fs.promises.writeFile(".env",file);
}
await login();
...
})();
,
通常将.then()
或await
与承诺一起使用,而不是同时使用。并且login()
之前已被执行,因为通过.then()
已解决了诺言。
在调用await
之前,没有保证返回到login()
。
解决方案1::快速解决方案是在await login();
的回调中解析fs.writeFile
,但随后也必须处理login()的错误,刚开始会使代码变得更加冗长。
const answers = await inquirer.prompt(questions);
let file = `IG_USERNAME=${answers.username}\nIG_PASSWORD=${answers.password}\n#ONLINE_MODE=true`;
fs.writeFile(".env",file,async (err) => {
if (err) console.error("Error:fs.writeFile()::",err);
else console.log(`Used as ${chalk.green(process.env.IG_USERNAME)}`);
try {
await login();
} catch (e) {
console.error("Error::login():",e);
}
});
解决方案2: util.promisify
,节点> = V8
使fs.writeFile
兑现承诺。
const fs = require("fs");
const { promisify } = require("util");
const promisedWriteFile = promisify(fs.writeFile);
try {
const answers = await inquirer.prompt(questions);
let file = `IG_USERNAME=${answers.username}\nIG_PASSWORD=${answers.password}\n#ONLINE_MODE=true`;
await promisedWriteFile(".env",file);
await login();
} catch (error) {
console.error("Any error::",error);
}
解决方案3: 带有Node> = V10的fs Promises API
try {
const answers = await inquirer.prompt(questions);
let file = `IG_USERNAME=${answers.username}\nIG_PASSWORD=${answers.password}\n#ONLINE_MODE=true`;
await fs.promises.writeFile(".env",error);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。