#javascript #node.js #asynchronous #pipe #jsonstream
#javascript #node.js #асинхронный #канал #jsonstream
Вопрос:
У меня есть JSON, как показано ниже customers.json
{
"customers":[
{ "name": "customer1"},
{ "name": "customer2"},
{ "name": "customer3"}
]
}
var fs = require('fs'),
JSONStream = require('JSONStream'),
es = require('event-stream');
async function run(){
var getStream = function () {
var jsonData = 'customers.json',
stream = fs.createReadStream(jsonData, { encoding: 'utf8' }),
parser = JSONStream.parse('customers.*');
return stream.pipe(parser);
};
var arr = [];
getStream()
.on('data', function (chunk) {
arr.push(chunk);
})
.on('end', function () {
console.log('All the data in the file has been read' arr.length);
})
.on('close', function (err) {
console.log('Stream has been Closed');
});
console.log('end run()');
}
async function main(){
run().then(function(){
console.log('In then');
}).catch(function(){
console.log('In catch');
})
}
main();
В выводе почему «В то время» печать перед «end», «close». событие.
Как получить «В then» или в Catch после события «end», «close».
Как я могу выполнить метод run() синхронно.
Комментарии:
1. JSONStream в первую очередь предназначен для больших файлов, в которых вы хотите проанализировать некоторые разделы файла без необходимости анализировать все целиком. Так ли это здесь? Или моего ответа достаточно?
2. @LindaPaiste, это правда, что у меня огромный json, поэтому я не могу прочитать весь файл в памяти. Так что вашего ответа недостаточно.
Ответ №1:
При асинхронном запуске функции вызовы console
не обязательно будут выполняться по порядку. Вы не должны полагаться на то, что что-либо делается по порядку, если оно асинхронное.
Если вы хотите сделать run()
синхронный, это на самом деле намного проще, чем то, что вы делаете сейчас, потому что вам вообще не нужно использовать потоки. Вы можете просто вызвать fs.readFileSync
, чтобы загрузить данные из локального файла json. В этой статье объясняются некоторые различия.
var fs = require('fs');
function run() {
const rawData = fs.readFileSync("customers.json"); // Buffer
const jsonData = JSON.parse(rawData); // object
jsonData.customers.forEach( o => console.log(o.name) );
}
function main() {
run();
console.log("done");
}
main();
Вывод на консоль:
customer1
customer2
customer3
done