2013-10-18 32 views
0

我想從Parse.com中獲取數據並在加載完所有數據後觸發事件。 方法getEinstellerData,getObjektDatagetVermieterData包含對parse.com數據庫的異步查詢。查詢中的對象被正確地取回。Promise在Javascript中不起作用,返回undefined

我寫的代碼accordring到:http://www.html5rocks.com/en/tutorials/async/deferred/

我現在的問題是,這裏面我居然在第一承諾全局變量寫的var combinedPromise = $.when(getVermieterData(vermieterId), getEinstellerData(einstellerId));參數,似乎是不確定的。

我已經得到了下面的函數來獲取數據:

getData = function() { 

     var promise = getObjektData(); 

     promise.done(
      function(){ 

       var combinedPromise = $.when(getVermieterData(vermieterId), getEinstellerData(einstellerId)); 
       combinedPromise.done(function(){ 

        console.log(einstellerData); 
        console.log(vermieterData); 

        $(that).trigger("setWohnungsDetails"); 
       }); 
      }); 

    }, 

這些都是包含查詢3個功能:

getEinstellerData = function(){ 
    einstellerData = []; 

    var queryEinsteller = new Parse.Query(erstellerDataObject); 

    queryEinsteller.equalTo("ID", parseInt(einstellerId)); 

    queryEinsteller.first({ 
     success: function(einsteller) { 

     var vorname = einsteller.get("Vorname"); 
     var nachname = einsteller.get("Nachname"); 
     var strasse = einsteller.get("Strasse"); 
     var hausnummer = einsteller.get("Hausnummer"); 
     var plz = einsteller.get("PLZ"); 
     var ort = einsteller.get("Ort"); 
     var email = einsteller.get("Email"); 
     var telefon = einsteller.get("Telefon"); 

     einstellerData.push({ vorname: vorname, nachname: nachname, strasse: strasse, hausnummer: hausnummer, plz: plz, ort: ort, email: email, telefon: telefon }); 

     console.log(einstellerData); 
     }, 
     error: function(error) { 
     alert("Error: " + error.code + " " + error.message); 
     } 
    }); 
}, 

getVermieterData = function(){ 
    vermieterData = []; 

    var queryVermieter = new Parse.Query(vermieterDataObject); 

    queryVermieter.equalTo("ID", parseInt(vermieterId)); 

    queryVermieter.first({ 
     success: function(vermieter) { 

     var vorname = vermieter.get("Vorname"); 
     var nachname = vermieter.get("Nachname"); 
     var strasse = vermieter.get("Strasse"); 
     var hausnummer = vermieter.get("Hausnummer"); 
     var plz = vermieter.get("PLZ"); 
     var ort = vermieter.get("Ort"); 
     var email = vermieter.get("Email"); 
     var telefon = vermieter.get("Telefon"); 

     vermieterData.push({ vorname: vorname, nachname: nachname, strasse: strasse, hausnummer: hausnummer, plz: plz, ort: ort, email: email, telefon: telefon }); 

     console.log(vermieterData); 
     }, 
     error: function(error) { 
     alert("Error: " + error.code + " " + error.message); 
     } 
    }); 
}, 

getObjektData = function() { 

    objectId = localStorage.getItem("currentWohnung"); 

    objektData = []; 

    var queryObjekt = new Parse.Query(objektDataObject); 

    queryObjekt.get(objectId, { 
     success: function(wohnung) { 

     var vermieter_id = wohnung.get("Vermieter_id"); 
     var einsteller_id = wohnung.get("Einsteller_id"); 
     var strasse = wohnung.get("Strasse"); 
     var hausnummer = wohnung.get("Hausnummer"); 
     var plz = wohnung.get("PLZ"); 
     var ort = localStorage.getItem("selectedStadt"); 
     var bild = wohnung.get("Bild"); 
     var flaeche = wohnung.get("Flaeche"); 
     var freitext = wohnung.get("Freitext"); 
     var gesamtmiete = wohnung.get("Gesamtmiete"); 
     var kaution = wohnung.get("Kaution"); 
     var miete = wohnung.get("Miete"); 
     var nebenkosten = wohnung.get("Nebenkosten"); 
     var raucher = wohnung.get("Raucher"); 
     var zimmer = wohnung.get("Zimmer"); 


     objektData.push({ vermieter_id: vermieter_id, einsteller_id: einsteller_id, strasse: strasse, hausnummer: hausnummer, plz: plz, ort: ort, bild: bild, flaeche: flaeche, freitext: freitext, gesamtmiete: gesamtmiete, kaution: kaution, nebenkosten:nebenkosten, raucher: raucher, zimmer: zimmer }); 

     console.log(objektData); 

     einstellerId = einsteller_id; 
     vermieterId = vermieter_id; 
     }, 
     error: function(object, error) { 
     console.log("error" + error); 
     } 
    }); 

在這裏,我的控制檯輸出:

DetailStart init DetailStart.js:3 
DetailController init DetailController.js:10 
init Detail.js Detail.js:17 
Uncaught TypeError: Cannot call method 'done' of undefined Detail.js:34 
DetailStart.Detail.getData Detail.js:34 
DetailStart.Detail.init Detail.js:21 
DetailStart.DetailController.init DetailController.js:13 
DetailStart.init DetailStart.js:4 
(anonymous function) detail.html:115 
[Object] 
0: Object 
length: 1 
__proto__: Array[0] 

任何想法,我可能在這裏得到錯誤!?

在此先感謝;)

+0

'promise'是未定義的,因爲您從未將其設置爲等於任何值。 'getObjektData'不返回任何東西。 –

+0

我該怎麼做? – Igle

+0

取決於你想要做什麼...... –

回答

0

我不熟悉您正在使用的庫,但它看起來像你的混合可以一起使用回調和承諾,但你必須要小心。例如,

queryEinsteller.first({ 
    ... 
}); 

將立即返回,導致combinedPromise被稱爲successerror成員之前得到解決。您需要做的是創建一個在調用successerror時解決的承諾。然後您可以從getEinstellerData返回該承諾。你需要在getVermieterData中做同樣的事情。

有關如何執行此操作的示例,您應該在引用的網頁中的「使用$ .Deferred放在一起」一節中學習示例。

0

queryObject.get(..)的調用將返回一個承諾,如果你想允許鏈接,那麼你需要從你的函數返回值,即

getObjektData = function() { 
    // .. other code .. 
    return queryObjekt.get(objectId, { 
     success: /* .. your success handler .. */ 
     error: /* .. your errror handler .. */ 
    }); 
}; 

基本上只是添加回報聲明您的來電,在你的其他功能中也一樣。

問題是你希望第一個查詢在第二個查詢完成之前完成,第三個查詢與第二個查詢完成相同(即以下查詢需要來自先前查詢的數據),還是希望所有三個查詢都可以啓動並執行什麼時候他們都完成了?

一旦你爲我回答這個問題,我會用樣本更新這個問題。

+0

我希望'getObjektData'首先完成,因爲它爲我想從其他2個查詢中獲得的對象尋找id。這兩個可能同時發生。 – Igle