2014-05-14 1 views
0

저는 javascript에 비교적 익숙하며 nodejs에서 작업하고 있습니다. 나는 woulf가 다음 코드로 끓는다면 상황이있다. 아래 코드에서했던 것처럼 다른 변수 (temp)를 작성하지 않고 콜백에서 직접 리턴 할 수 있습니까?자바 스크립트에서 스코핑은 어떻게 작동합니까?

exports.run = function(req, res) { 

    var testRunId = req.body.testRunId; 
    var testFileDir = './uploads/temptestfiles/'+ testRunId + '/'; 

    var error = null 
    var status ; 

    mkpath(testFileDir, function (err) { 

     if (!err) { 
      error = {error:'could not create logs directory'} 
      status = 500 
     }; 

    }); 

    if (status === 500) { 
     return res.send(500, error); 
    } 

//handle many more cases 

} 

다음은 다운 버전입니다.

var a = function(param,callback) { 
    callback(param); 
}; 

var base = function() { 
    val temp = null;   
    a(5, function(a){ 
     //can I do something like return 2*a and end the parent function 
     temp = 2*a; 
    }); 

    return temp; 
} 

나는 실제로 내가 그 디렉토리가 생성되기 전에 추가로 코드를 실행하려면 해달라고로 mkpath의 동기 버전을 사용하는 데 필요한 깨달았다. 그래서 내 코드를

try { 
    mkpath.sync(testFileDir); 
} catch(err) { 
    return res.status(500).send({error:'couldn\'t create directory to store log files'}); 
} 
+0

중 하나가 동기, 그리고 당신이 필요하지 않습니다, 또는 비동기, 그리고 다음이 작동하지 않을 것입니다. 우리는 정말로 덜 무례한 예가 필요합니다. –

+0

req, res와 관련된 실제 코드를 추가했습니다. – raju

+0

그리고 실제 코드가 대답을 변경했습니다 ... – epascarello

답변

1

으로 바 꾸었습니다. 물론 할 수는 있지만 콜백, 콜백 처리기 및 호출 함수에서 값을 반환해야합니다.

var a = function (param, callback) { 
    return callback(param); 
}; 

var base = function() { 
    return a(5, function (a) { 
     return 2*a; 
    }); 
} 

비동기 경우에는 작동하지 않습니다. 그런 다음 콜백 함수가 필요하거나 지연된 약속 또는 미래를 반환해야합니다. 예를 들어

function asynchDoubler(number) { 
    var deferred = new Deferred(); 
    setTimeout(function() { 
     deferred.callback(2*number); 
    }, 1); 
    return deferred; 
} 

asynchDoubler(5).addCallback(function (result) { 
    console.log(result); 
    }); 
// outputs 10 
+0

이 dir이 생성되기 전에 추가 코드를 실행하고 싶지 않기 때문에 mkpath의 동기화 버전이 필요하다는 것을 알게되었습니다. mkpath.sync (testFileDir); path.exists (if (! err) res.send (500, {오류 : '로그 파일을 저장할 디렉토리를 만들 수 없습니다.}}) } – raju

+0

일반적으로 엄지 손가락의 경우 동기화되지 않은 버전의 동기화는 절대로 원하지 않습니다. 원하는 흐름에서 코드를 계속 진행하는 올바른 방법은 콜백에 넣는 것입니다. 지연이나 콜백 함수를 사용하여 도우미 객체를 사용합니다. – Hampus

관련 문제