如何在javascript中以非同步的方式进行解析或字符串化

问题描述:

我看到JSON.stringify和JSON.parse都是同名的。如何在javascript中以非同步的方式进行解析或字符串化

我想知道是否有一个简单的npm库以异步方式执行此操作。

谢谢

+0

看看这个 - https://www.npmjs.com/package/json-parse-async –

+0

从源头上看,这个库似乎并没有在这里做任何异步。 JSON.parse位于主线程中,并阻止事件循环。 –

+0

Javascript不是多线程的......它只能交换执行机会 –

您可以通过使用承诺做什么“异步”:

function asyncStringify(str) { 
    return new Promise((resolve, reject) => { 
    resolve(JSON.stringify(str)); 
    }); 
} 

然后你可以使用它像任何其他承诺:

asyncStringfy(str).then(ajaxSubmit); 

注意,因为代码不是异步的,承诺将立即解决(在对JSON进行字符串化时没有阻止操作,它不需要任何系统调用)。

您还可以使用异步/ AWAIT API,如果你的平台支持:

async function asyncStringify(str) { 
    return JSON.stringify(str); 
} 

然后你可以用同样的方式:

asyncStringfy(str).then(ajaxSubmit); 
// or use the "await" API 
const strJson = await asyncStringify(str); 
ajaxSubmit(strJson); 

编辑:一添加真正的异步解析/字符串化(可能是因为我们解析的东西太复杂了)的方式是将作业传递给另一个进程(或服务)并等待响应。

您可以在许多方面做到这一点(如创建新的服务共享一个REST API),我将在这里展示与流程之间的消息传递这样的方式:

首先创建一个将文件关心解析/字符串化。说它异步json.js的例子的缘故:

// async-json.js 
function stringify(value) { 
    return JSON.stringify(value); 
} 

function parse(value) { 
    return JSON.parse(value); 
} 

process.on('message', function(message) { 
    let result; 
    if (message.method === 'stringify') { 
    result = stringify(message.value) 
    } else if (message.method === 'parse') { 
    result = parse(message.value); 
    } 
    process.send({ callerId: message.callerId, returnValue: result }); 
}); 

所有这个过程确实是等待一个消息,询问到字符串化或分析JSON,然后用正确的价值做出回应。 现在,在您的代码中,您可以派生此脚本并向前和向后发送消息。每当一个请求被发送,您可以创建一个新的承诺,无论何时返回响应这一要求,就可以解决的承诺:

const fork = require('child_process').fork; 
const asyncJson = fork(__dirname + '/async-json.js'); 

const callers = {}; 

asyncJson.on('message', function(response) { 
    callers[response.callerId].resolve(response.returnValue); 
}); 

function callAsyncJson(method, value) { 
    const callerId = parseInt(Math.random() * 1000000); 
    const callPromise = new Promise((resolve, reject) => { 
    callers[callerId] = { resolve: resolve, reject: reject }; 
    asyncJson.send({ callerId: callerId, method: method, value: value }); 
    }); 
    return callPromise; 
} 

function JsonStringify(value) { 
    return callAsyncJson('stringify', value); 
} 

function JsonParse(value) { 
    return callAsyncJson('parse', value); 

} 

JsonStringify({ a: 1 }).then(console.log.bind(console)); 
JsonParse('{ "a": "1" }').then(console.log.bind(console)); 

注:这只是一个例子,但我们知道这一点,你可以计算出其他改进或其他方式来做到这一点。希望这是有帮助的。

+0

谢谢。但是你在代码中调用JSON.stringify .. 它是否使代码异步? –

+0

分析怎么样? –

+0

@Mark_M解析将是同样的事情,只要用'parse'改变'stringify'即可。 –

检查了这一点,另一个NPM套餐的

async-json is a library that provides an asynchronous version of the standard JSON.stringify.

Install-

npm install async-json 

例 -

var asyncJSON = require('async-json'); 

asyncJSON.stringify({ some: "data" }, function (err, jsonValue) { 
    if (err) { 
     throw err; 
    } 

    jsonValue === '{"some":"data"}'; 
}); 

注意 - 没有对它进行测试,您需要手动检查它的依赖关系和 所需的软件包。