2016-11-12 3 views
0

Я относительно новым для JavaScript, и я действительно не понимаю, что я здесь делаю неправильно, но возвращаемое значение не установлено:Как вернуть значение в Javascript

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, рядом, Си-Би) { вар _dataDictionary = loopback.findModel ('DataDictionary'); найдено = _dataDictionary.findOne (findByModelNameQuery функция (эээ, результат) { , если (результат) { если (result.record) { нашел = истинный } еще { найден = ложь }} возвращение нашли }); ... set query.where на основе найденного значения ..... ctx.query.where = query.where } next(); }); –

ответ

0

Это появляется что _dataDictionary.findOne - asynchronous 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), чтобы возвращать результаты, я предлагаю вам использовать функцию обратного вызова.

Чтобы получить результат, вы можете сделать что-то вроде:

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

Тогда вы можете назвать «MYFUNCTION» в другом месте, как:

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

OBS1: если Титулы являются еще одной функцией , «уродливый» способ сделать это - использовать вложенные обратные вызовы, которые обычно являются «antipattern».

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

спасибо всем. Получил это работу :-) –

Смежные вопросы