如何在javascript中以asycnhronous方式解析或Stringify

时间:2017-10-09 12:34:40

标签: json node.js parsing npm

我看到JSON.stringify和JSON.parse都是sycnhronous。

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

谢谢

3 个答案:

答案 0 :(得分:3)

您可以使用Promises:

使任何“异步”
<!DOCTYPE html>
<!--[if lt IE 7]>      <html lang="en" ng-app="myApp" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html lang="en" ng-app="myApp" class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html lang="en" ng-app="myApp" class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en" ng-app="myApp" class="no-js"> <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>My AngularJS App</title>
  <meta name="description" content="">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="bower_components/html5-boilerplate/dist/css/normalize.css">
  <link rel="stylesheet" href="bower_components/html5-boilerplate/dist/css/main.css">
  <link rel="stylesheet" href="app.css">
  <script src="bower_components/html5-boilerplate/dist/js/vendor/modernizr-2.8.3.min.js"></script>
</head>
<body>
  <ul class="menu">
    <li><a href="#!/view1">view1</a></li>
    <li><a href="#!/view2">view2</a></li>
  </ul>

  <!--[if lt IE 7]>
      <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
  <![endif]-->

  <div ng-view></div>

  <div>Angular seed app: v<span app-version></span></div>

  <!-- In production use:
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/x.x.x/angular.min.js"></script>
  -->
  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/angular-route/angular-route.js"></script>
  <script src="app.js"></script>
  <script src="view1/view1.js"></script>
  <script src="view2/view2.js"></script>
  <script src="components/version/version.js"></script>
  <script src="components/version/version-directive.js"></script>
  <script src="components/version/interpolate-filter.js"></script>
  <script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
  <script src="view_auth/auth.js"></script>
  <!--<script src="view_jokes/jokes.js"></script>-->
  <script src="bower_components/satellizer/dist/satellizer.js"></script>
</body>
</html>

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

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

请注意,因为代码不是异步的,所以会立即解析promise(对字符串化JSON没有阻塞操作,它不需要任何系统调用)。

如果您的平台支持,您还可以使用async / await API:

asyncStringfy(str).then(ajaxSubmit);

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

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

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

您可以通过多种方式执行此操作(例如创建共享REST API的新服务),我将在此处演示一种在进程之间传递消息的方法:

首先创建一个文件,负责进行解析/字符串化。为了示例,请将其命名为 async-json.js

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

所有这一过程都是等待消息,要求字符串化或解析JSON,然后使用正确的值进行响应。 现在,在您的代码上,您可以分叉此脚本并反复发送消息。每当发送请求时,您创建一个新的承诺,只要响应回到该请求,您就可以解决承诺:

// 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 });
});

注意:这只是一个例子,但了解这一点,您可以找出其他改进或其他方法。希望这很有帮助。

答案 1 :(得分:0)

检查一下,另一个 npm 包 -

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

安装 -

npm install async-json

实施例 -

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

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

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

注意 - 没有测试它,你需要手动检查它的依赖性和   所需的包裹。

答案 2 :(得分:0)

通过异步,我假设您实际上是说非阻塞异步-即,如果您有一个大(兆字节)的JSON字符串,并且进行了字符串化,那么您不会希望您的网络服务器在处理该对象时硬冻结并阻止新传入的Web请求500毫秒以上。

选项1

一般的答案是逐步遍历对象,然后在达到阈值时调用setImmedate。然后,这将使事件队列中的其他功能运行一会儿。

对于JSON(反序列化),yieldable-json库可以很好地做到这一点。但是,它确实极大地牺牲了JSON处理时间(这在一定程度上是故意的)。

用法:

const yj = require('yieldable-json')
yj.stringifyAsync({key:"value"}, (err, data) => {
  if (!err)
    console.log(data)
})

选项2

如果处理速度非常重要(例如实时数据),则可能需要考虑生成多个Node线程。尽管初始设置相当艰巨,但我曾经成功使用PM2 Process Manager。但是,一旦运行成功,最终结果将是神奇的,并且不需要修改您的源代码,只需修改您的package.json文件即可。它充当Node应用程序的代理,负载平衡器和监视工具。它有点类似于Docker swarm,但是是裸机,并且不需要服务器上的特殊客户端。