【问题标题】:Return Object Outside of Function返回函数外的对象
【发布时间】:2015-07-05 03:46:33
【问题描述】:

我正在尝试在函数之外返回一个对象。我正在使用 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 asavailableProviders` 未在该函数之外定义。

ReferenceError: availableProviders is not defined

有没有办法解决这个问题。任何帮助表示赞赏。提前致谢!

【问题讨论】:

    标签: javascript angularjs firebase promise angular-promise


    【解决方案1】:

    与 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;
    }
    

    【讨论】:

    • 啊哈!所以就像在全球范围内定义 availableProviders 一样简单?
    • 是的..这很容易..延迟不应该在那里。因为它什么都不做
    • 感谢您的帮助。
    • @realph 很高兴听到它对您有所帮助。不要忘记接受答案..谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2021-06-28
    • 2019-05-13
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多