异步版本的JSON.stringify和JSON.parse

时间:2016-06-03 03:27:40

标签: node.js



 var assert = require('assert');
 var parseJSON = require('json-parse-async');

 var contact = new Object();
 contact.firstname = "Jesper";
 contact.surname = "Aaberg";
 contact.phone = ["555-0100", "555-0120"];

 var contact2 = new Object();
 contact2.firstname = "JESPER";
 contact2.surname = "AABERG";
 contact2.phone = ["555-0100", "555-0120"];

 contact.toJSON = function(key) {
   var replacement = new Object();
   for (var val in this) {
     if (typeof(this[val]) === 'string')
       replacement[val] = this[val].toUpperCase();
     else
       replacement[val] = this[val]
   }
   return replacement;
 };

 var jsonText = JSON.stringify(contact);
 contact = JSON.parse(jsonText);
 console.log(contact);
 console.log(contact2);

 assert.deepEqual(contact, contact2, 'these two objects are the same');




JSON.parseJSON.stringifyassert.deepEqual的异步等效函数是什么?我试图在以下代码中创建竞争条件和非确定性行为,但我无法找到上述函数的非阻塞,异步等效。

2 个答案:

答案 0 :(得分:-1)

node.js没有内置的实际异步JSON解析器。如果你想要一些实际上在主node.js Javascript线程之外进行解析的东西,那么你必须找到一个第三方模块来解析Javascript线程之外的JSON(例如在本机代码线程或其他一些进程中) )。 NPM中有一些模块将自己宣传为异步,例如async-json-parserasync-json-parsejson-parse-async。您必须验证您感兴趣的实现是否真的是异步实现(当您在后台解析时,您的Javascript会继续运行)。

但是,在阅读有关您尝试解决的问题的问题中的详细信息时,听起来您实际上并不需要在后台真正发生的解析器。为了让您能够测试您尝试测试的内容,我觉得您只需要一个不确定的结束,允许其他代码在解析完成之前运行。这可以通过将同步JSON.parse()包装在具有随机延迟的承诺的setTimeout()中来完成。这将为其他代码运行一些随机的时间(尝试测试您的竞争条件)。这可以这样做:

JSON.parseAsyncRandom = function(str) {
    return new Promise(function(resolve, reject) {
        // use a random 0-10 second delay
        setTimeout(function() {
            try {
                resolve(JSON.parse(str));
            } catch(e) {
                 reject(e);
            }
        }, Math.floor(Math.random() * 10000));
    });
}


JSON.parseAsyncRandom(str).then(function(obj) {
    // process obj here
}, function(err) {
    // handle err here
});

注意:这不是真正的异步执行。这是一个异步结果(因为它会在一些随机时间到来,其他代码将在结果到达之前运行),但真正的异步执行在后台与其他JS运行并行发生,这并不是很好那。但是,鉴于您的评论,您只是想要用于测试目的的变量和异步结果,这应该这样做。

答案 1 :(得分:-2)

你可以使用'bluebird',就像这个例子一样,将调用函数转换为promise。

我使用javascript es6编写下面的代码。

const Promise = require('bluebird')

function stringifyPromise(jsonText) {
   return Promise.try(() => JSON.stringify(jsonText))
}

function parsePromise(str) {
   return Promise.try(() => JSON.parse(str))
}

stringifyPromise(contact)
  .then(jsonText => parsePromise(jsonText))
  .then(contact => {
    assert.deepEqual(contact, contact2, 'these two objects are the same')
  })
})