2013-06-23 6 views
2

У меня есть объявление функции, как показано ниже. Как вернуть значение из функции/анонимной функции родительскому.Как вернуть значение из функции обратного вызова

Вот код, который я пытаюсь работать на

LB.getData = function(key) { 
    if(!key) return; 

    appAPI.db.async.get(key, function(value){ 
     data = (value === null) ? null : JSON.parse(value); 
     return data 
    }); 
}; 


var myData = LB.getData('user'); 

ответ

7

Похоже асинхронной функции. Вся суть асинхронного программирования заключается в том, что вы не возвращаете значения. Вы подписываетесь на обратные вызовы, в которых вы используете результаты. Потому что, если вы возвращаете значения, это означает, что вызывающей стороне вашей функции придется ждать, пока это значение не будет доступно. И ждать плохо, потому что вы будете замораживать этого звонящего.

Так одна возможность заключается в том, чтобы обеспечить вашу родительскую функцию с параметром обратного вызова, который позволил бы потребитель этой функции, чтобы получить результаты асинхронной операции:

LB.getData = function(key, callback) { 
    if(!key) return; 

    appAPI.db.async.get(key, function(value) { 
     var data = (value === null) ? null : JSON.parse(value); 
     // invoke the callback and pass the results to it 
     callback(data); 
    }); 
}; 

, а затем просто обеспечивают функцию обратного вызова при потреблении родитель:

LB.getData('user', function(data) { 
    // use the data here 
    alert(data.someProperty); 
});