Node.js - process.nextTick 和 parseJSON

Node.js - process.nextTick and parseJSON

在 Node.js 中解析 JSON 的最高效方法是什么?

使用 process.nextTick 并稍微延迟以下片段中的答案有什么好处,难道不应该将整个 try/catch 封装到 process.nextTick 中吗?

function parseJSON(json, done) {
     try {
         var result = JSON.parse(json);
         process.nextTick(function() { done(null, result); });
     } catch (err) {
         process.nextTick(function() { done(err); });
     }
}

首先 . process.nextick 是异步的... Try catch 可能无法按预期工作.. JSON.parse 是解析 json string

的首选方法

首先,因为 JSON.parse 是同步的,所以使用回调没有意义。

这两段代码基本上做同样的事情。最下面一个效率更高:

parseJSON(json, function(err, result) {
    if (err) {
        //ERROR
    }
    else {
        //PARSED
    }
});

try {
    var result = JSON.parse(json);
    //PARSED
}
catch (e) {
    //ERROR
}

现在开始您的实际问题:

What's the advantage of using process.nextTick...

基本上没有 "advantage" 除非你不使用 process.nextTick 然后你的函数调用变得更加同步。以此为例:

console.log('1');
parseJSON(json, function(err, result) {
    console.log('parsed');
});
console.log('2');

当使用 process.nextTick 时,您将得到以下输出:

1
2
parsed

发生这种情况是因为 process.nextTick 将回调函数放在事件循环的末尾。这意味着它会先让其他事情发生,然后再执行回调。

如果你没有使用 process.nextTick 那么你会得到这个输出:

1
parsed
2

发生这种情况是因为 parseJSON 在调用回调之前不会退出。

这两个版本都有效,但对于回调,您通常希望它们真正异步。


至于 try-catch,如果您要尝试捕获来自 JSON.parse 的错误,那么它的位置很好。由于您似乎想要处理错误(因为如果它抛出异常,您将错误参数传递给回调)那么我会说它是正确的。

--> 在 Node.js 中解析 JSON 的最高效方法是什么?

JSON 可能是流,因为内存占用少。

查看 dominictarr 或 mafintosh 所做的工作

https://github.com/mafintosh/json-format-stream

https://github.com/mafintosh/through-json

https://github.com/dominictarr/JSONStream