2016-04-04 30 views
3

ben ayrı değişkene işlevine bir başvuru kaydetmek SÜRECE, bulunmazsa bir işlevi, yürütmeye çalışıyorum:kapsamı

function updateCheck() { 
      if (this.isNewVersionNeeded()) { 
       var buildFunc = this.buildObject(); 
       this.updateBiography().then(function(){ 
        buildFunc(); 
       }) 
      } 
     }; 

buildObject işlevi, yalnızca this.updateBiography (async işlevi) çalıştırılmadan önce kaydeder ve onu (buildFunc) içine kaydettiğim değişken aracılığıyla çalıştırırsam çalışır. Aşağıdaki işe ETMEZ:

  function updateCheck() { 
       if (this.isNewVersionNeeded()) { 
        this.updateBiography().then(function(){ 
         this.buildObject(); 
        }) 
       } 
      }; 

Bir hizmet nesnesi aracılığıyla tüm fonksiyonları maruz: "Bu" nesneyi oturum açtığınızda

var service = { 
      all: all, 
      updateBiography: updateBiography, 
      get: get, 
      updateCheck: updateCheck, 
      isNewVersionNeeded:isNewVersionNeeded, 
      buildObject:buildObject 
     }; 
     return service; 

Im sağ buildFunc yürütülmesinden önce pencereyi kaydeder iken/global kapsam. Neden böyle ve bununla nasıl başa çıkmalıyım? Tüm uyumsuzluk yöntemlerini ayrı bir değişkendeki sadece onları hatırlamak için kaydetmek istemiyorum. Bu problemle nasıl başa çıkmalıyım ve neden çalışmıyor?

tüm hizmeti:

(function() { 
    angular 
     .module('biography.services', []) 
     .factory('Biography', Biography); 

    Biography.$inject = ['$http']; 

    function Biography($http) { 

     var biographyObject = { } ; 

     var service = { 
      all: all, 
      updateBiography: updateBiography, 
      get: get, 
      updateCheck: updateCheck, 
      isNewVersionNeeded:isNewVersionNeeded, 
      buildObject:buildObject 
     }; 
     return service; 

     var self = this; 
     function updateCheck() { 
      if (this.isNewVersionNeeded()) { 
       this.updateBiography().then(function(){ 
        self.buildObject(); 
       }) 
      } 
     }; 

     function updateBiography() { 
      return $http.get("Apicall adress") 
         .then(function (resp) { 
          window.localStorage.setItem('biography', resp.data); 
          window.localStorage.setItem('biographyTimeStamp', Date.now()); 
         }, function (err) { 
          console.log('ERR', err); 
         }); 
     } 

     function all() {  
      return biographyObject; 
     } 

     function get(name) { 
      var biography = biographyObject; 
      for (var i = 0; i < biography.length; i++) { 
       if (biography[i].name === name) { 
        return biography[i]; 
       } 
      } 
      return null; 
     } 


     function buildObject() { 
      var temp = JSON.parse(window.localStorage.getItem('biography')); 
      biographyObject = temp; 
     }; 

     function isNewVersionNeeded() { 
      prevTimeStamp = window.localStorage.getItem('biographyTimeStamp'); 
      var timeDifference = (Date.now() - prevTimeStamp); 
      timeDifference = 700000; 
      if (timeDifference < 600000) { 
       return false; 
      } 
      else { 
       return true; 
      } 
     } 
    } 
})(); 

cevap

1

bağlam anonim fonksiyon enait (işlev kapsamından farklı), daha sonraki bir zamanda çağrıldığında belirlenir.

basit kuraldır - nokta ör myObj.doSomething() solunda olduğu doSomethingthis olarak myObj erişmesini sağlar neyse.

function updateCheck() { 
    if (this.isNewVersionNeeded()) { 
     this.updateBiography().then(function() { 

// whichever object has this anonymous function defined/invoked on it will become "this" 

      this.buildObject(); 
     }) 
    } 
}; 

Eğer sadece fonksiyon referans geçen yaptığınızdan, sadece kullanabileceğiniz bu

function updateCheck() { 
    if (this.isNewVersionNeeded()) { 
     this.updateBiography().then(this.buildObject); 
    } 
}; 

ve this.buildObject bağlamda bağımlı olup olmadığını ve (dahili this anahtar kelimeyi kullanır) Eğer

this kullanılabilir bağlam (nesne) işlevi tarafından çağrılır ve anonim bir işlev veya bir nesne aracılığıyla başvurulan bir işlev varsayılan olarak bir window içeriğine sahip olduğu ortaya çıkar. bind fonksiyonu gerçek bir nesne referansla this tüm örneklerini değiştirir, böylece, artık


(farklı nesneler üzerinde) farklı bağlamlarda çağrılan aynı işlevi

var obj = { 
    a: function() { 
     console.log(this); 
    } 
}; 
var aReference = obj.a; 
aReference(); // logs window, because it's the default "this" 
obj.a(); // logs obj 
1

burada 'bu' function.You 'bu' callback.Hence içindeki çözümdür erişemez geri arama atıfta nedeni,

function Biography($http) { 
     var self = this; 

     function updateCheck() { 
       if (this.isNewVersionNeeded()) { 
        this.updateBiography().then(function(){ 
         self.buildObject(); 
        }) 
       } 
      }; 

kullanma ES6 sözdizimi:

function updateCheck() { 
        if (this.isNewVersionNeeded()) { 
         this.updateBiography().then(()=>{ 
          this.buildObject(); 
         }) 
        } 
       }; 
+1

sayesinde çok amaca , ES6 çözümü çalışır. Diğeri yok (zaten denedim). Bence işe yaramıyor çünkü ben kendi kendime yaptığım yerde = bu tanımsız olarak geri dönüyor.Yani kodun neresinde koymalıyım? (tüm hizmeti gösterecek şekilde düzenlenmiştir) – Kai

+0

işlevinin içine yerleştir Biyografi() {var self = this} – Ved

+0

aslında, 'bu' anonim işlevin nerede tanımlandığına ve bağlam açık değilse, hangi yoldan çağrıldığına bağlıdır. 'call/bind/apply' ile ayarlayın – neaumusic