2015-04-26 2 views
2

Я пытаюсь вернуть объект за пределы функции. Я использую обещание Angular JS для регистрации availableProviders, когда они были загружены, что правильно регистрируется на моей консоли.Объект возврата вне функции

function getServiceProviders(serviceId) { 
    var serviceProviders = ref.child('services').child(serviceId).child('providers'); 
    var providers = ref.child('providers'); 

    serviceProviders.on('value', function(snapshot) {  // on services.serviceId.providers 
    var availableProviders = {};       // create empty availableProviders array 

    snapshot.forEach(function(childSnapshot) {    // for each provider in services.serviceId.providers 
     var key = childSnapshot.key();      // grab each provider's key 
     providers.on('value', function(snap) {    // on providers 
     if (snap.hasChild(key)) {       // if providers has a child that matches the var key above 
      var item = snap.child(key);      // store that child in a var called item 
      availableProviders[item.key()] = item.val();  // add item to availableProviders array 
     } 
     }); 
    });             // rinse and repeat 

    var defer = $q.defer(); 
    defer.promise 
     .then(function() { 
     console.log(availableProviders); 
     }) 

    defer.resolve(); 
    }); 

    return availableProviders; 
} 

Я хочу, чтобы функция getServiceProviders() вернуть эти availableProviders, but I'm getting this error as availableProviders` не определена вне этой функции.

ReferenceError: availableProviders is not defined 

Есть ли какой-либо способ вокруг этого. Любая помощь приветствуется. Заранее спасибо!

ответ

3

Проблема, связанная с закрытием в JavaScript, я думаю, вам нужно переместить var availableProviders = {}; снаружи serviceProviders.on('value', function(snapshot) { функция исправит вашу проблему.

Код

function getServiceProviders(serviceId) { 
    var serviceProviders = ref.child('services').child(serviceId).child('providers'); 
    var providers = ref.child('providers'); 
    var availableProviders = {}; // <==made it global 
    serviceProviders.on('value', function(snapshot) { // on services.serviceId.providers 

     snapshot.forEach(function(childSnapshot) { // for each provider in services.serviceId.providers 
      var key = childSnapshot.key(); // grab each provider's key 
      providers.on('value', function(snap) { // on providers 
       if (snap.hasChild(key)) { // if providers has a child that matches the var key above 
        var item = snap.child(key); // store that child in a var called item 
        availableProviders[item.key()] = item.val(); // add item to availableProviders array 
       } 
      }); 
     }); // rinse and repeat 

     var defer = $q.defer(); 
     defer.promise 
      .then(function() { 
       console.log(availableProviders); 
      }) 

     defer.resolve(); 
    }); 

    return availableProviders; 
} 
+1

Aha! Так что это было так же просто, как определение «доступных поставщиков» во всем мире? – realph

+1

Кроме того, требуется ли еще отсрочка на этом этапе? – realph

+1

Я .. это было легко..Деферред не должен быть там. Потому что он ничего не делает –

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