我按照下面这段示例代码写了一段代码
var promise=require("bluebird")
var promise = new Promise(function(resolve, reject) {
resolve(1);
});
promise.then(function(val) {
console.log(val); // 1
return val + 2;
}).then(function(val) {
console.log(val); // 3
});
以下是我写的
var http=require("http")
var fs=require("fs")
var promise=require("bluebird")
var directory="D:/ccav/"
function handle_incoming_request(req,res){
load_album_list_async(directory).then(isDir_async(filesArray)).then(function(onlyDirArray){
var opt={"error":null,data:onlyDirArray}
console.log("请求:"+req.method+" "+req.url);
res.writeHead(200,{"Content-type":"application/json","Charset":"UTF-8"});
res.end(JSON.stringify(opt)+"\n");
}).catch(function(err){console.error(err)})
}
function load_album_list_async(dir){
return new promise(function(resolve,reject){
fs.readdir(dir,function(err,filesArray){
if(err){reject(err)}else{resolve(filesArray)}
})
})
}
function isDir_async(filesArray){
return new promise(function(resolve,reject){
var onlyDirArray=[];
for(var i=0;i<filesArray.length;i++){
fs.stat(filesArray[i],function(err,stats){
if(stats.isDirectory()){
onlyDirArray.push(filesArray[i]);
}
})
}
resolve(onlyDirArray)
})
}
var s=http.createServer(handle_incoming_request);
s.listen(80)
运行会报错,去掉中间的then就没问题:
load_album_list_async(directory).then(isDir_async(filesArray)).then(function(onlyDirArray){
^
ReferenceError: filesArray is not defined
在网上搜了半天也没有类似的代码可以参考,求大神指点,我应该怎么写?
load_album_list_async(directory).then(isDir_async(filesArray)) filesArray哪来的?
load_album_list_async(directory).then(isDir_async) 这样就好
还有
function isDir_async(filesArray){
return new promise(function(resolve,reject){
var onlyDirArray=[];
for(var i=0;i<filesArray.length;i++){
fs.stat(filesArray[i],function(err,stats){
if(stats.isDirectory()){
onlyDirArray.push(filesArray[i]);
}
})
}
resolve(onlyDirArray)
})
}
这里面不行的. 你array里面没执行完就会resolve, 要么把fs.stat封装,然后promise.All().要么用async.
看起来我犯了两个错误:
1、then应该传给一个函数,我那样写就是传函数的值。
2、异步循环不是那么简单。
我还是先照抄书上的解法,用递归吧:
function isDir_async(filesArray) {
return new promise(function(resolve, reject) {
var onlyDirArray = new Array();
(function iterator(index) {
console.log("当前index的值:"+index)
if (index == filesArray.length) {
resolve(onlyDirArray)
console.log("onlyDirArray的内容是"+onlyDirArray)
} else {
fs.stat(directory + filesArray[index], function(err, stats) {
if (err) {
console.error(err)
} else {
if (stats.isDirectory()) {
onlyDirArray.push(filesArray[index]);
}
iterator(index + 1)
}
})
}
})(0)
})
}