首页 > nodejs promise then里面的函数传参报错undefined

nodejs promise then里面的函数传参报错undefined

我按照下面这段示例代码写了一段代码

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)
    })
}
【热门文章】
【热门文章】