2012-10-04 19 views
2

我有一個Ember應用程序,通常會向服務器發送ajax請求以獲取其數據。我面臨的問題是每個請求都需要在URL上附加一個簽名。這個簽名需要經常計算,因爲它只有10秒纔有效。系統要求我從服務器請求此簽名,可能使用ajax請求。所以,我的問題是,Ember永遠不會使用從ajax請求返回的簽名,因爲它不會按預期等待。強制Ember等待來自Ajax請求的值

有問題的代碼是在這裏:http://jsfiddle.net/veDjq/

在該代碼中,signatureApp.Post總是undefined雖然我可以看到,簽名的要求,如果我console.logApp.Signatureresponse返回正確的值。

我是Ember的新手,所以我很可能會採用這種錯誤的方式。最後,每當Ember對象需要從服務器請求數據時,我需要能夠請求新的簽名。我試圖使用jQuery的$.ajaxSend來更改URL,但它不適用於GET請求。

回答

2

在您的success處理程序中,this不是您認爲的那樣。看起來你打算讓this成爲App.Signature類。爲了做到這一點,您可以將簽名ajax的context選項設置爲this

我也建議看看承諾。他們會幫助你清理這些代碼。例如(未經測試):

App.Signature.reopenClass({ 
    retrieveSignature: function(){ 
     return $.ajax({ 
      url: '/auth/', 
     }); 
    } 
}); 

App.Post.reopenClass({ 
    postedPosts: [], 
    find: function(){ 
     var postClass = this; 
     var signaturePromise = App.Signature.retrieveSignature(); 
     signaturePromise.done(function(signature){ 
      var postsRetrieval = $.ajax({ 
       url: 'http://someserver.com/1/posts/list.json?' + signature, 
       dataType: 'json' 
      }); 
      postsRetrieval.done(function(response){ 
       response.data.forEach(function(post){ 
        postClass.postedPosts.addObject(App.Post.create(post)) 
       }); 
      }); 
     }); 
     return this.postedPosts; 
    } 
}); 
+1

謝謝盧克!仔細研究'this'的範圍就可以解決它。我也接受了你的建議,並使用了一些承諾,它更好。我很感激幫助。 – aezell

1

您正在返回this.signature$.ajax請求仍在運行。您可能希望將包含主要ajax調用的回調函數傳遞給App.Signature.getSignature,並從成功或完成回調中運行該回調。

編輯:等等。我剛剛意識到你的異步設置爲false,所以我的初始評論是不正確的。