2016-11-12 2 views
0

에 값을 반환하는 방법은 자바 스크립트 비교적 새로운 오전 정말 내가 잘못 여기서 뭐하는 거지 이해가 안하지만 반환 값은 설정되지 않는 :는 자바 스크립트

found = _dataDictionary.findOne(findByModelNameQuery, function(err, result) { 
    if (result) { 
     if (result.record) { 
      found = true 
     } else { 
      found = false 
     } 
    } 
    return found 
}); 
+5

아마도 ... 비동기 콜백을 사용하고 있습니다. – Hydro

+1

어딘가에 함수를 호출 했습니까? – Marciano

+0

이 코드는 Model.observe ('액세스', 함수 (ctx, next, cb) { var_dataDictionary = loopback.findModel ('dataDictionary'); found = _dataDictionary.findOne (findByModelNameQuery ... , 함수 (ERR, 결과)) { 경우 (결과) { (result.record) { 찾은 경우 = TRUE 한다} else { 발견 = 거짓 } } 복귀 발견} 찾은 값을 기준으로 query.where를 설정하십시오. ..... ctx.query.where = query.where } next(); }}); –

답변

0

그것은 를 나타납니다 _dataDictionary.findOneasynchronous function입니다. 따라서 문에서 반환 된 값은 나중에 콜백 내부에서 할당 된 값과 다릅니다.

귀하의 예를 리팩토링 잘하면 당신이 표시됩니다 :

_dataDictionary.findOne(findByModelNameQuery, function(err, result) { 
    if (result) { 
    if (result.record) { 
     found = true 
    } else { 
     found = false 
    } 
    } 

    // This statement returns to the `findOne` line executing this callback 
    // return found; 

    // Instead you can log here to see the value 
    console.log('FOUND', found); 
}); 

UPDATE : 의견 (그리고 몇 가정)에 따라 다시 호출하는 함수에 값을 제공하기 위해 리팩토링 수 :

Model.observe('access', function(ctx, next, cb) { 
    var _dataDictionary = loopback.findModel('dataDictionary'); 

    _dataDictionary.findOne(findByModelNameQuery, function(err, result) { 
    if (result) { 
     if (result.record) { 
     found = true; 
     } else { 
     found = false; 
     } 
    } 

    // Assuming cb is the method to return values if async 
    cb(found); 
    }); 

    // Assuming this is for async behavior to notify to the `observe` caller that this is an async callback 
    next(); 
}); 
0

콜백 함수 (findOne의 마지막 매개 변수에있는 함수)를 사용하면서 결과를 반환하기 위해 콜백 함수를 사용하는 것이 좋습니다.

... 
myFunction(params, function(err,result){ 
     //do something with the result) 
} 

OBS1 : 당신이 좋아하는 다른 장소에서 "myFunction이"를 호출 할 수 있습니다 그리고

function myFunction(myParams, callback){ 
    _dataDictionary.findOne(myParams, function(err,result){ 
     return callback(err,result); 
    }); 
} 

: 같은

이 결과를 얻으려면, 당신은 뭔가를 할 수있는 PARAMS는 다른 함수 경우 , "못생긴"방법은 일반적으로 "반 패턴"인 중첩 콜백을 사용하는 것입니다.

function myFunction(myParams, callback){ 
    _dataDictionary.findOne(myParams, function(err,result1){ 
     _anotherAsyncFunction(result1.params, function(err,result2){ 
       //do something with result2 and callback it. 
     }); 
    }); 
} 

OBS2 : 당신은 라이브러리 등 async "폭포"방법 또는 bluebird Promise Library "다음"방법을 사용하여이 안티 패턴을 피할 수 있습니다.

+0

모두에게 감사드립니다. 알았어 :-) –