2014-02-20 114 views
4

当我使用filemanager功能的目录(/)代码工作正常,但当我调用文件(/index.html)代码返回一个错误。JavaScript的承诺和if/else语句

我看到if/else语句中的问题(readdir即使isDir返回false也会运行),但我不知道如何正确使用它与承诺。

var fs = require('fs'), 
    Q = require('q'), 
    readdir = Q.denodeify(fs.readdir), 
    readFile = Q.denodeify(fs.readFile); 

function isDir(path) { 
    return Q.nfcall(fs.stat, __dirname + path) 
     .then(function (stats) { 
      if (stats.isDirectory()) { 
       return true; 
      } else { 
       return false; 
      } 
     }); 
} 

function filemanager(path) { 
    if (isDir(path)) { 
     return readdir(__dirname + path) 
      .then(function (files) { 
       return files.map(function (file) { 
        return ...; 
       }); 
      }) 
      .then(Q.all); 
    } else { 
     return readFile(__dirname + path, 'utf-8') 
      .then(function (content) { 
       return ...; 
      }); 
    } 
} 

filemanager('/').done(
    function (data) { 
     ... 
    }, 
    function (err) { 
     ... 
    } 
); 

回答

3

isDir返回一个承诺,这总是一个真值。您需要将then回调中的条件设置为可以访问布尔值:

function isDir(path) { 
    return Q.nfcall(fs.stat, __dirname + path) 
     .then(function (stats) { 
      return stats.isDirectory() 
     }); 
} 

function filemanager(path) { 
    return isDir(path).then(function(isDir) { 
     if (isDir) { 
      return readdir(__dirname + path) 
       .then(function (files) { 
        return files.map(function (file) { 
         return ...; 
        }); 
       }) 
       .then(Q.all); 
     } else { 
      return readFile(__dirname + path, 'utf-8') 
       .then(function (content) { 
        return ...; 
       }); 
     } 
    }); 
} 
2

您致电isDir(path)评估为承诺。所以你不能直接从该函数中得到结果。相反,你必须等待返回的Promise解决,然后评估那里的价值。因此,您需要一个像isDir(path).then(...)这样的结构,而不是您当前使用的if (isDir(path))