2014-02-20 4 views
4

filemanager 디렉토리 (/) 코드를 사용하면 코드가 제대로 작동하지만 파일 (/index.html)을 호출하면 오류가 발생합니다.자바 스크립트 약속 및 if/else 문

if/else 문 (isDirfalse을 반환하는 경우에도 readdir이 실행 됨)의 문제가 표시되지만 약속과 함께 올바르게 사용하는 방법을 알지 못합니다.

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가 반환 할 때까지 기다렸다가 해결 한 다음 그 값을 평가해야합니다. 따라서 현재 사용중인 if (isDir(path)) 대신 isDir(path).then(...)과 같은 구문이 필요합니다.

관련 문제