如何在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));
注:这只是一个例子,但我们知道这一点,你可以计算出其他改进或其他方式来做到这一点。希望这是有帮助的。
谢谢。但是你在代码中调用JSON.stringify .. 它是否使代码异步? –
分析怎么样? –
@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"}';
});
注意 - 没有对它进行测试,您需要手动检查它的依赖关系和 所需的软件包。
看看这个 - https://www.npmjs.com/package/json-parse-async –
从源头上看,这个库似乎并没有在这里做任何异步。 JSON.parse位于主线程中,并阻止事件循环。 –
Javascript不是多线程的......它只能交换执行机会 –