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.parse
,JSON.stringify
和assert.deepEqual
的异步等效函数是什么?我试图在以下代码中创建竞争条件和非确定性行为,但我无法找到上述函数的非阻塞,异步等效。
答案 0 :(得分:-1)
node.js没有内置的实际异步JSON解析器。如果你想要一些实际上在主node.js Javascript线程之外进行解析的东西,那么你必须找到一个第三方模块来解析Javascript线程之外的JSON(例如在本机代码线程或其他一些进程中) )。 NPM中有一些模块将自己宣传为异步,例如async-json-parser或async-json-parse或json-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')
})
})