首页 文章

如何制作JSON.parse承诺? (或异步)[重复]

提问于
浏览
-2

这个问题在这里已有答案:

我正在尝试创建一个返回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承诺?还是异步?就像你怎么能在函数中“返回”来等待JSON.parse的结果?

如果你能提供简单的承诺代码......那将非常有帮助 . 非常感谢你提前 . (我对bluebird js或async / await等开放......)

添加代码(更多关于原始代码)

在函数中,我正在读取json文件,然后是JSON.parse它,然后返回结果 . (source是json文件的路径)

function test(source) {
fs.readFile(source, function (err, content) {
return JSON.parse(content));
});
}
console.log(test('test.json'));
// it says
// undefined

json文件看起来像这样(test.json)

{
"a": "apple",
"b": "banana",
"c": "cat"
}

1 回答

  • 1

    JSON.parse() 确实是同步的,因此是 console.log() ,return语句也是如此 . 除非您明确地使其异步,否则Javscript中的所有内容都是同步的(并且是单线程的) .

    你得到一个 undefined ,因为你在 raw 传递给 JSON.parse() 的任何东西实际上都不是一个字符串 .

    这是一个显示它同步运行的实例 .

    function test(raw) {
      return JSON.parse(raw);
    }
    
    console.log('this happens first');
    console.log(test('{"valid1": true}'));
    console.log('this happens 3rd');
    console.log(test('{"valid2": true}'));
    console.log('this happens last');
    

相关问题