javascript - nodejs promise then里面的函数传参报错undefined
大家讲道理
大家讲道理 2017-04-11 11:15:27
[JavaScript讨论组]

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

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

运行会报错,去掉中间的then就没问题:

load_album_list_async(directory).then(isDir_async(filesArray)).then(function(onlyDirArray){
                                                                            ^
ReferenceError: filesArray is not defined

在网上搜了半天也没有类似的代码可以参考,求大神指点,我应该怎么写?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
大家讲道理
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.

PHP中文网

看起来我犯了两个错误:
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)
    })
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号