等待异步函数导致未定义
Posted
技术标签:
【中文标题】等待异步函数导致未定义【英文标题】:Await for asynchronous function results in undefined 【发布时间】:2018-05-27 02:39:42 【问题描述】:我在使用 Node.js 进行异步/等待时遇到问题。当我尝试这个时:
function Read_Json_File()
fs.readFile('import.json','utf-8',(err, data) =>
if (err) throw err;
json_data = JSON.parse(data);
return json_data;
);
async function run_demo()
let get_json_file = await Read_Json_File();
console.log(get_json_file);
run_demo();
它返回 undefined 而不是文件中的 JSON。为什么不等待文件读取完成?
【问题讨论】:
【参考方案1】:你错过了承诺解决和拒绝。
如下使用。
function Read_Json_File()
return new Promise((resolve,reject)=>
fs.readFile('import.json','utf-8',(err, data) =>
if (err) reject(err);
json_data = JSON.parse(data);
resolve(json_data);
);
);
【讨论】:
【参考方案2】:你没有从Read_Json_File
返回任何东西,因此你得到了未定义的——你从回调中返回的数据不会产生任何结果。相反,要使用 async/await,您需要承诺 fs.readFile
,因为它还没有。然后你就可以使用 async/await 了:
function readJSONFile()
return new Promise((resolve, reject) =>
fs.readFile('import.json', 'utf-8', (err, data) =>
if (err) reject(err);
resolve(JSON.parse(data));
);
);
Await 需要一个实际的 promise 来等待。这样做是返回一个使用 await 的承诺。因此,我们一直等到调用resolve
——这发生在我们加载完 JSON 之后:
let json = await readJSONFile();
console.log(json);
我们在这里调用readJSONFile
。这将返回一个承诺,该承诺会在 JSON 文件加载完成时解析,并允许看似同步执行异步代码。
【讨论】:
是的,现在它就像做梦一样谢谢,但我听说我可以在不使用 Promise 的情况下使用 async/await。这是真的吗? @OFSTTP 等待期待一个承诺。 Async/await 只是 Promise 的语法糖。一旦你把它归结起来,async/await 只是承诺——你不能只是同步执行异步代码。在某种程度上,你总是需要使用 Promise,并且 async/await 函数最终会变成更多的 Promise。 @OFSTTP 请参阅:developer.mozilla.org/en-US/docs/Web/javascript/Reference/…【参考方案3】:试试看:
function Read_Json_File()
return new Promise(resolve,reject =>
fs.readFile('import.json','utf-8',(err, data) =>
if (err) reject(err);
json_data = JSON.parse(data);
resolve(json_data);
);
【讨论】:
这是前两个答案的精确副本,这次缩进很差,没有任何解释性文字。以上是关于等待异步函数导致未定义的主要内容,如果未能解决你的问题,请参考以下文章