2015-01-01 4 views
0

일련의 테스트를 수행하는 함수가 있습니다. 첫 번째 테스트는 함수가 종료해야 실패 할 경우, 그러나 그렇지 않습니다 :nodejs - 함수 반환하지 않음

function checkSite(site) { 
console.log("Checking if site is already processed or processing"); 
// Processed Sites 
fs.readFile("processed.txt", "utf8", function(error, data) { 
if (data.indexOf(site) > -1) { 
    console.log("Processed"); 
    return "Processed"; 
} else { 
    console.log("Not Processed"); 
} 
}); 
fs.readFile("processing.txt", "utf8", function(error, data) { 
if (data.indexOf(site) > -1) { 
console.log("Processing"); 
return "Processing"; 
} else { 
console.log("Not Processing, Queue for Processing"); 
// Queue for Processing 
fs.appendFile(fileProcessing, site, function (err) { 
    if (err) throw err; 
    console.log('The "data to append" was appended to file!'); 
}); 
} 
}); 
return "Success"; 
} 

을 나는 "처리"다음에 "가공"의 콘솔 출력을 얻고있다. 나는 그곳으로 돌아가는 "가공"을 절대로 보지 말아야한다. 내가 여기서 무엇을 놓치고 있니?

+0

들여 쓰기 수준마다 한 공간을 심각하게 코딩합니까? – jfriend00

+0

아니요, 이것은 단말기에서 복사했을 때의 형식입니다. –

답변

0

return "Processed"checkSite()이 아니라 콜백 함수에서 반환됩니다. 따라서 다음에 어떤 영향을 미치지 않습니다.

fs.readFile()은 비동기입니다. 두 번째 fs.readFile()이 처음 완료 될 때까지 기다리거나 첫 번째 fs.readFile()이 성공적으로 완료된 후에 추가 작업을 실행하지 않으려면이 코드를 다르게 코딩해야합니다.

function checkSite(site) { 
    console.log("Checking if site is already processed or processing"); 
    // Processed Sites 
    fs.readFile("processed.txt", "utf8", function(error, data) { 
     if (data.indexOf(site) > -1) { 
      console.log("Processed"); 
     } else { 
      console.log("Not Processed"); 
      fs.readFile("processing.txt", "utf8", function(error, data) { 
       if (data.indexOf(site) > -1) { 
        console.log("Processing"); 
       } else { 
        console.log("Not Processing, Queue for Processing"); 
        // Queue for Processing 
        fs.appendFile(fileProcessing, site, function(err) { 
         if (err) throw err; 
         console.log('The "data to append" was appended to file!'); 
        }); 
       } 
      }); 
     } 
    }); 
} 

참고 :

여기에 그 방법을 년대 fs.readFile() 작업이 비동기 따라서 이러한 조작 전에 checkSite() 반환이 완료하기 때문에 당신이 checkSite()에서 직접 성공 또는 실패 결과를 반환 할 수 없습니다. 결과를 checkSite()의 호출자에게 다시 전달하려는 경우 결과와 함께 호출되는 콜백 함수를 전달하거나 약속 구조를 사용하여 도움을 받거나 비동기 함수 대신 동기 함수로 전환해야합니다 버전 (일반적으로 권장하지 않음).

+0

if/else 문을 중첩하지 않도록했습니다. 명백하게. 감사! –

+0

여러 계층의 중첩을 방지하려면 연속 작업 연결에 대한 약속을 사용하십시오. – jfriend00

+0

이 시나리오에서 약속을 사용하는 예제를 추가 할 수 있습니까? 나는 컨셉을 머리 속에 감싸는 데 어려움을 겪고있다. –