私が今読んでいる素晴らしい本NodeJs design patterns
には、次の例があります。
var fs = require('fs');
var cache = {};
function inconsistentRead(filename, callback) {
if (cache[filename]) {
//invoked synchronously
callback(cache[filename]);
} else {
//asynchronous function
fs.readFile(filename, 'utf8', function(err, data) {
cache[filename] = data;
callback(data);
});
}
}
それから:
function createFileReader(filename) {
var listeners = [];
inconsistentRead(filename, function(value) {
listeners.forEach(function(listener) {
listener(value);
});
});
return {
onDataReady: function(listener) {
listeners.push(listener);
}
};
}
そしてそれの使用法:
var reader1 = createFileReader('data.txt');
reader1.onDataReady(function(data) {
console.log('First call data: ' + data);
作成者は、アイテムがキャッシュにある場合、動作は同期的であり、キャッシュにない場合は非同期的であると述べています。私はそれで大丈夫です。それから彼は、同期か非同期かのどちらかであるべきだと言い続けています。私はそれで大丈夫です。
私が理解していないのは、非同期パスを使用すると、この行var reader1 = createFileReader('data.txt');
が実行されたときに非同期ファイルの読み取りが既に完了していないため、リスナーは登録しようとする次の行に登録されないということです?