我根本想不通。我有一个包含文件的文件夹。我想用这些文件的信息创建一个 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 包装在一个承诺中,但我在承诺中丢失了文件名和正则表达式名。像这样:
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"
},
]
所以我最后的想法是为节点使用类似异步模块的东西。在我从函数返回回调后编写 json。但我也无法让它发挥作用。
提前致谢!
[编辑-我忘了提]
我忘了提到的是 AjaxCall url 是用正则表达式构建的。所以是这样的:
url = 'http://www.test.com/'+regex
所以这(如我所见)意味着我在调用 ajaxcall 之前执行正则表达式,但在调用之后我还需要正则表达式以写入 Json。我希望这是有道理的
[编辑 2 - 更多信息]
我的 XHR 调用看起来像这样(没有我错误的承诺解决方案。在这种情况下,我返回承诺的结果):
// 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];
};