私は単にこれを理解することはできません。ファイルを含むフォルダーがあります。これらのファイルの情報を含むjsonを作成したい。正確には、ファイル名、ファイル名の正規表現バージョン、および ajax 呼び出しから取得した追加データです。
個々のパーツは完璧に機能します。実際、コードを同期して実行すると、必要な結果が得られます。このようなもの:
[
{
"filename" : "first file",
"regexname" : "first file",
"ajaxresult" : "first file"
},
{
"filename" : "second file",
"regexname" : "second file",
"ajaxresult" : "second file"
},
]
しかし、すべてを「同期」しようとすると、使用するXHRモジュールが正しく機能せず、特に多くのファイルでブロックされるため、非同期で実行したいと考えています。私の「同期」コードは次のようになります(短くするために少し簡略化されています)
fs.readdir(datapath, function(err, files) {
var data = new Array();
if(err) throw err;
files.forEach(function(file){
var filename = file
, regex= filename.replace(/regex/)/i, "")
, filepath = './public/config/dataconfig.js'
, ajaxResults = getFile(url)
, mapFiles = null
mapFiles = { filename:filename, regexname:regex, ajaxcall:ajaxResults}
data[data.length] = mapfiles;
}
var JSONdata= JSON.stringify(data, null, 4);
fs.writeFile(filepath, JSONdata, function(e) {
if (!e) {
console.log('Done')
}else{
console.log('Failed', e)
};
});
});
ajaxcall を promise にラップしようとしましたが、promise 内のファイル名と正規表現名を失いました。そのようです:
fs.readdir(datapath, function(err, files) {
var data = new Array();
if(err) throw err;
files.forEach(function(file){
var filename = file
, regex= filename.replace(/regex/)/i, "")
, filepath = './public/config/dataconfig.js'
, mapFiles = null
// Make promise for async call with a url composed of the regex
var promise = getFile(url);
promise.then( function(result) {
mapFiles = { filename:filename, regexname:regex, ajaxcall:result}
data[data.length] = mapfiles;
var JSONdata= JSON.stringify(data, null, 4);
fs.writeFile(filepath, JSONdata, function(e) {
if (!e) {
console.log('Done')
}else{
console.log('Failed', e)
};
});
});
});
これにより、次の結果が得られます。
[
{
"filename" : "first file",
"regexname" : "first file",
"ajaxresult" : "first file"
},
{
"filename" : "first file",
"regexname" : "first file",
"ajaxresult" : "second file"
},
]
したがって、私の最終的な考えは、ノードに async モジュールのようなものを使用することでした。関数からコールバックを取得した後、json を記述します。しかし、私もそれを機能させることはできません。
前もって感謝します!
[編集 - 言い忘れたこと]
忘れていたのは、AjaxCall の URL が正規表現で作成されていることです。だから、このようなもの:
url = 'http://www.test.com/'+regex
したがって、これは(私が見ているように)ajaxcallを呼び出す前に正規表現を実行することを意味しますが、呼び出し後にJsonに書き込むために正規表現も必要です。これが理にかなっていることを願っています
[編集 2 - もう少し情報]
私の XHR 呼び出しは次のようになります (誤った promise ソリューションはありません。その場合、promise を結果と共に返します):
// Get info
function getFile(url) {
xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onreadystatechange = handler
var ajaxResult = null
//Callback
function handler (){
// If status is ready
if (this.readyState == 4 && this.status == 200) {
ajaxResult = eval(this.responseText);
console.log('XHR OK')
};
};
xhr.send(null);
return ajaxResult[0];
};