2013-05-27 4 views
0

다음 코드를 사용하면 "asyncfail"작업을 수행하면 콘솔로 이동하고 종료 코드가 0이 아닌 오류 출력이 발생할 것으로 예상됩니다 ("syncfail"작업과 마찬가지로). 실제로 실제로 발생하는 것은 jake가 더 이상의 출력 (아래 샘플 출력)없이 완료되고 프로세스 종료 코드가 성공을 나타냅니다. 제이크가 뭔가 잘못하고 있는지 확신 할 수 없거나 약속이 ... 어떤 아이디어?) (비동기 오류가있는 jake 작업으로 인해 오류 알림이 발생하지 않음

C:\src\letscodejavascript>node node_modules\jake\bin\cli.js -f .\jakerepro.js syncfail 
jake aborted. 
Error: synchronous failure 
    at api.fail (C:\src\letscodejavascript\node_modules\jake\lib\api.js:221:18) 
(See full trace by running task with --trace) 

C:\src\letscodejavascript [master]> $lastexitcode 
1 

C:\src\letscodejavascript [master]> .\jake.bat -f .\jakerepro.js asyncfail 

C:\src\letscodejavascript>node node_modules\jake\bin\cli.js -f .\jakerepro.js asyncfail 
finishing sync part 
finished timeout 
finished timeout 
finished timeout 
finished timeout 
all done, time to fail 

C:\src\letscodejavascript [master]> $lastexitcode 
0 

답변

1

는 이유는 실패 : 여기

var Q = require("q"); 

task("syncfail", function() { 
    fail("synchronous failure"); 
}); 

var http = require("http"); 

task("asyncfail", function() { 

    waitForSleep().then(waitForSleep).then(waitForSleep).then(waitForSleep).then(function() { 
     console.log("all done, time to fail"); 
     fail("This is the end"); 
    }); 

    console.log("finishing sync part"); 
}, { async:true}); 


function waitForSleep() { 
    var deferred = Q.defer(); 

    setTimeout(function() { 
    console.log("finished timeout"); 
    deferred.resolve(); 
    }); 

    return deferred.promise; 
} 

는 작업 (I 예상대로 완료) syncfail 및 asyncfail 일부 샘플 출력 (I 예상대로 완료되지 않습니다)입니다 작동하지 않는 것은 fail()이 외부 레이어에서 catch 된 예외를 throw하여 작동하지만 그 예외가 .then() 구현에 의해 포착 된 것입니다. 이 방법으로 약속을 사용하는 동안 fail()을 예상대로 작동 시키려면 setTimeout에서 fail() 호출을 래핑하여 .then() 핸들러 외부에서 오류를 다시 throw해야했습니다.

var Q = require("q"); 

task("asyncfail", function() { 

    waitForSleepPromise() 
    .then(waitForSleepPromise) 
    .then(waitForSleepPromise) 
    .then(waitForSleepPromise) 
    .then(function() { 
     console.log("all done, time to fail"); 

     deferError(function() { 
      fail("This is the end", "fasdf"); 
     }); 
    }); 

    console.log("finishing sync part"); 
}, { async:true}); 


function waitForSleepPromise() { 

    var deferred = Q.defer(); 

    setTimeout(function() { 
    console.log("finished timeout"); 
    deferred.resolve(); 
    }, 10); 

    return deferred.promise; 
} 

function deferError(callback) { 
    try { 
    callback(); 
    } 
    catch (err){ 
    setTimeout(function() { 
     throw err; 
    }, 0); 
    } 
} 
+0

당신은 약속 한대로 .done()을 호출 할 수 있습니다. .done()은 처리되지 않은 오류를 다시 throw하므로 jake의 처리기가 올바른 작업을 수행 할 수 있습니다. fwiw, bluebird.js는 .done()을 사용하지 않습니다. o/\ o <- 안녕하세요 ~ fives to frank :) – busticated