Javascript 返回函数外部的对象

Javascript 返回函数外部的对象,javascript,angularjs,firebase,promise,angular-promise,Javascript,Angularjs,Firebase,Promise,Angular Promise,我试图返回一个函数之外的对象。我使用Angular JS promise来记录加载后的可用Providers,这将正确地记录到我的控制台 function getServiceProviders(serviceId) { var serviceProviders = ref.child('services').child(serviceId).child('providers'); var providers = ref.child('providers'); servicePro

我试图返回一个函数之外的对象。我使用Angular JS promise来记录加载后的
可用Providers
,这将正确地记录到我的控制台

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,但是我得到了这个错误,因为该函数之外没有定义
availableProviders'

ReferenceError: availableProviders is not defined

这有什么办法吗。感谢您的帮助。提前谢谢

与JavaScript中的闭包相关的问题,我认为您需要移动
var availableProviders={}外部
服务提供者。在('value',函数(快照){
函数将修复您的问题

代码

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;
}
函数getServiceProviders(serviceId){ var serviceProviders=ref.child('services').child(serviceId).child('providers'); var providers=ref.child(“providers”);
var availableProviders={};//Aha!所以这就像在全球范围内定义
availableProviders
一样简单?耶..很简单..延迟不应该在那里。因为它什么都不做感谢您的帮助。@realph很高兴听到它帮助了您。别忘了接受答案..谢谢。