2014-02-20 38 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))