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

查看:279
本文介绍了javascript - 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.

这篇关于javascript - nodejs promise then里面的函数传参报错undefined的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆