2014-10-23 2 views
0

이 이상한 문제가 발생했습니다. 여기에있는 매우 기본적인 것이 있습니다.
Express가있는 NodeJs에서 Javascript를 코딩하고 있습니다.함수에서 콜백이 반환되지 않습니다.

간단한 경로를 고려하십시오.

client.get('/test', function(req, res, next) { 
    return next(new Error('This is a error')); 
    console.log ('This code will not be executed'); 
    res.send('This code will not be executed'); 
}); 

아마 당신은이 경로는 직접 next()을 호출하고 에러 핸들러로 제어를 전달합니다시피. 오류가 출력되고 (res.json) 요청이 종료됩니다. 오직 경로의 첫 번째 행이 실행됩니다 ... 그것은 있어야합니다.

이제이에 라우터의 첫 번째 행을 변경할 수 있습니다 :

client.get('/test', function(req, res, next) { 
    hlpr.deadSimple('stop here', function (err) { 
     if (err) return next(err); 
    }); 
    console.log ('I dont want this code to be executed, but it will be...'); 
    res.send('This code shall not be executed either'); 
}); 

기능 deadSimple은 다음과 같습니다 그리고 난 오류가 생성이 코드를 시도하면 hlpr.js

module.exports.deadSimple = function (val, callback) { 
    if (val === 'stop here') { 
     callback(new Error('This is a error!')); 
     // I have also tried "return callback(new Error('This is a error!'));" 
    } 
}; 

에서 수출된다 오류 처리기가 호출 된 것처럼 보이지만 오류를 출력하지만 다음처럼 console.log이 실행되기 때문에 컨트롤이 경로 처리기 함수로 다시 전달 된 것처럼 보입니다.

왜 내 deadSimple 함수가 컨트롤을 경로 처리기로 다시 전달합니까?

그리고 내가 원하는 방식으로 작동하도록하려면 어떻게 작성해야합니까? 즉, deadSimple이 오류를 생성하면이 오류는 경로 처리기 함수에서 직접 반환을 트리거하고 오류 처리기로 제어를 전달하며 출력 오류 ... 그리고 하지 다시 경로 처리기에 제어를 전달!

편집 내가 콜백 로 전달되는 익명 함수에서 return 문은 주변 경로에서 자체에서 반환하고 하지 즉 것을 여기 놓친 아주 기본적인 무언가가 있었다

핸들러 함수.

console.log와 res.send를 콜백으로 옮기면 이 실행되지 않을 것입니다. 왜냐하면 콜백 함수는 실행되기 전에 반환되기 때문입니다. 콜백이 동기식 코드 만 포함하면 (콜백) 코드는 콜백 아래의 코드가 실행되기 전에 completley로 실행됩니다.

내 지점을 표시하려면 ...이 의도 한대로 작동합니다

client.get('/test', function(req, res, next) { 
    var foo = null; 
    hlpr.deadSimple('stop here', function (err) { 
     foo = err; 
    }); 
    if (foo) return next(foo); 

    console.log ('This text WILL not be seen'); 
    res.send('This text WILL not be seen either'); 
}); 

답변

1

이벤트 핸들러 내부의 다른 코드를 넣어보십시오, 그래서 iffalse 경우에만 실행할 수 있습니다 :

client.get('/test', function(req, res, next) { 
    hlpr.deadSimple('stop here', function (err) { 
     if (err) return next(err); 
     console.log ('I dont want this code to be executed, but it will be...'); 
     res.send('This code shall not be executed either'); 
    }); 
}); 
+0

이 마법처럼 작동합니다 ... 아하! 라우트 핸들러에서의'return'은 주변의 익명의 콜백 함수로부터 리턴 된 것이지 실제 라우트 핸들러 함수는 아닙니다. =) –

1

거의 맞습니다. 귀하의 예 :

client.get('/test', function(req, res, next) { 
    hlpr.deadSimple('stop here', function (err) { 
     if (err) return next(err); 
    }); 
    console.log ('I dont want this code to be executed, but it will be...'); //this line is executed right away 
    res.send('This code shall not be executed either'); 
}); 

먼저 콜백을 요구하는 hlpr.deadSimple을 실행합니다.

client.get('/test', function(req, res, next) { 
    hlpr.deadSimple('stop here', function (err) { //everything inside this function will be executed only when it calls back 
     if (err) return next(err); 
     console.log ('I dont want this code to be executed, but it will be...'); 
     res.send('This code shall not be executed either'); 
    }); 

}); 

날 간단한 비유 (이것은이 사이트에 어딘가에 존재를 사용하여 설명하려고하자,하지만 : 당신이 다음 기능을 실행하기 전에이 콜백을 위해 대기하는 경우에, 당신은 당신의 콜백 함수 내에서 그들을 배치해야 나는 그것을 못 찾는다. ...) :

당신은 직장에있다. 그리고 당신은 당신의 동료 짐으로부터의 서류를 필요로한다. 당신은 당신의 전화를 집고 짐에게 전화를 걸었습니다, 누가 이렇게 말합니다 : "내가 볼께. 내가 다시 전화 할게." 그런 다음 전화를 끊고 커피 휴식을 취하십시오. 잠시 후 Jim은 당신에게 전화를 걸어 정보를 제공합니다. 그러면 양식을 채울 수 있습니다.

상황은 위와 같이 작성할 수 있습니다!

Jim.call(function(info){ 
    fillForm(info)  //that's the part you do only when your colleague calls back 
} 
haveBreak(); // That's the action you take just after calling Jim, before he calls you back 
+0

예, 행 3의'return '이 익명의 콜백에서만 반환되고 외부 경로 처리기에서는 반환되지 않는 문제가 아닙니까? 하지만 어쩌면 이것은 당신이 의미하는 바입니다. 다른 말로하면 ... = P –

+0

콜백에 응답했지만 이미 너무 늦었을 때 res.send()가 이미 실행되었습니다. – xShirase

+0

흠 ...하지만이 콜백은 동기 코드 만 포함합니다. 아래 코드가 실행되기 전에 완료되어야합니다. 권리? –

관련 문제