Javascript 如何做出JSON.parse承诺?(或异步)
我试图创建一个返回JSON.parse结果的函数。以下是示例代码:Javascript 如何做出JSON.parse承诺?(或异步),javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,我试图创建一个返回JSON.parse结果的函数。以下是示例代码: function test(raw) { return JSON.parse(raw); } // assume I provide valid raw_input... console.log(test(raw_input)); // expect json object but it says "undefined"... 我想我知道为什么(如果我错了,请纠正我)。JSON.parse不是异步的。。。它在准备就绪时返回
function test(raw) {
return JSON.parse(raw);
}
// assume I provide valid raw_input...
console.log(test(raw_input));
// expect json object but it says "undefined"...
我想我知道为什么(如果我错了,请纠正我)。JSON.parse不是异步的。。。它在准备就绪时返回其结果。并且console.log不会等待其结果。。。更像是console.log认为它已经完成了,所以它说“未定义”
这是我的问题。。。你如何做出JSON.parse承诺?还是异步?比如,如何在函数中“return”以等待JSON.parse的结果
如果你能提供简单的承诺代码。。。那真的很有帮助。事先非常感谢你。(我对bluebird js或async/await等开放)
添加代码(有关raw的更多信息)
在函数中,我读取json文件,然后对其进行json.parse,然后返回结果。(源是json文件的路径)
json文件如下所示(test.json)
JSON.parse()
确实是同步的,console.log()
也是同步的,return语句也是同步的。Javscript中的所有内容都是同步的(和单线程的),除非您显式地使其异步
您得到的是一个未定义的
,因为您传入raw
到JSON.parse()
的内容不是有效的JSON,或者是空的,或者可能实际上不是字符串
下面是一个实时示例,显示它同步运行
功能测试(原始){
返回JSON.parse(原始);
}
log(“这首先发生”);
log(test(“{”valid1:true}”);
log(“这发生在第三次”);
log(test(“{”valid2:true}”);
log(“这是最后一次发生”)
JSON.parse()
确实是同步的,console.log()
也是同步的,return语句也是同步的。Javscript中的所有内容都是同步的(和单线程的),除非您显式地使其异步
您得到的是一个未定义的
,因为您传入raw
到JSON.parse()
的内容不是有效的JSON,或者是空的,或者可能实际上不是字符串
下面是一个实时示例,显示它同步运行
功能测试(原始){
返回JSON.parse(原始);
}
log(“这首先发生”);
log(test(“{”valid1:true}”);
log(“这发生在第三次”);
log(test(“{”valid2:true}”);
log(“这是最后一次发生”)代码>谢谢你的评论。但我不同意我的JSON文件无效或为空。例如,如果我在函数中尝试console.log(JSON.parse(raw))而不返回它,它会正确地表示JSON对象。@ryan return总是等待,除非您显式地使某个对象异步,否则它是同步的。@ryan不,您所假设的不可能是真的。@Soviut“不是有效的JSON,或者它是空的,或者它实际上不是字符串。”---在这种情况下,这将是一个例外,函数将不会返回。@ryan不客气,我希望您在副本中找到一个好的解决方案以实现所需的结果:)谢谢您的评论。但我不同意我的JSON文件无效或为空。例如,如果我在函数中尝试console.log(JSON.parse(raw))而不返回它,它会正确地表示JSON对象。@ryan return总是等待,除非您显式地使某个对象异步,否则它是同步的。@ryan不,您所假设的不可能是真的。@Soviut“不是有效的JSON,或者它是空的,或者它实际上不是字符串。”---在这种情况下,这将是一个例外,函数将不会返回。@ryan不客气,我希望您找到了一个好的解决方案,以在副本中实现所需的结果:)什么是原始的
?提供一个完整的可运行示例来演示您的问题。您提供的代码将导致错误,而不是您声称的“未定义”输出,因为调用测试(raw)中未定义raw
@JaromandaX这可能会让人困惑:)我只是假设我提供了正确的原始输入hehe现在更改了查看代码的完整上下文如何解释函数返回undefined的原因,因为它实际上返回undefined!什么是raw
?提供一个完整的可运行示例来演示您的问题。您提供的代码将导致错误,而不是您声称的“未定义”输出,因为调用测试(raw)中未定义raw
@JaromandaX这可能会让人困惑:)我只是假设我提供了正确的原始输入hehe现在更改了查看代码的完整上下文如何解释函数返回undefined的原因,因为它实际上返回undefined!
function test(source) {
fs.readFile(source, function (err, content) {
return JSON.parse(content));
});
}
console.log(test('test.json'));
// it says
// undefined
{
"a": "apple",
"b": "banana",
"c": "cat"
}