代码之家  ›  专栏  ›  技术社区  ›  Igl3

想要在回调中更新Object,给出正确的日志,但全局Object没有更新

  •  0
  • Igl3  · 技术社区  · 11 年前

    我对在Javascript中使用回调函数相当陌生。我也不确定回调是否是我的问题。

    我从数据库中获取一些数据,并希望使用.push方法将其保存到Objekt中。

    在把它推到那里之后,我记录了这个对象,它记录了正确的数据。所以数据库连接不可能是个问题。

    我正在处理一个模型-视图-控制器模型,希望控制器将数据从模型传递到视图组件。如果我尝试Models get方法,我会得到一个空对象。

    正如您在调用getData()的init函数中看到的那样,我试图通过日志记录来找出数据丢失的位置。此日志已返回一个“未定义-未定义”。

    有人知道为什么会发生这种情况吗?或者有人认为我对回调方法的使用存在主要误解吗?

    我真的很感激这里的帮助。

    提前感谢;)

    DetailStart.Detail = (function() {
        var that = {},
    
        vermieterDataObject = null,
        erstellerDataObject = null,
        objektDataObject = null,
    
        vermieterData = null,
        einstellerData = null,
        objektData = null,
    
        objectId = null,
    
        init = function() {
            console.log("init Detail.js");
    
            setupParse();
    
            getData(function(){
                console.log(einstellerData);
                console.log(vermieterData);
                $(that).trigger("setWohnungsDetails");
            });
    
    
            return that;
        },
    
        getData = function(callback) {
    
            getObjektData(function(einsteller, vermieter){
                getVermieterData(vermieter);
                getEinstellerData(einsteller);
            });
    
            callback();
        },
    
        getEinstellerData = function(einsteller){
            einstellerData = [];
    
            var queryEinsteller = new Parse.Query(erstellerDataObject);
    
            queryEinsteller.equalTo("ID", parseInt(einsteller));
    
            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(vermieter){
            vermieterData = [];
    
            var queryVermieter = new Parse.Query(vermieterDataObject);
    
            queryVermieter.equalTo("ID", parseInt(vermieter));
    
            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(callback) {
    
            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);
    
                callback(einsteller_id, vermieter_id);
              },
              error: function(object, error) {
                console.log("error" + error);
              }
            });
    
    
    
        },
    
        getObjekt = function() {
            return objektData;
        },
    
        getVermieter = function() {
            return vermieterData;
        },
    
        getEinsteller = function() {
            return einstellerData;
        },
    
        setupParse = function() {
            Parse.initialize("ApplicationKey");
    
            objektDataObject = Parse.Object.extend(localStorage.getItem("selectedStadt"));
            erstellerDataObject = Parse.Object.extend("Anbieter");
            vermieterDataObject = Parse.Object.extend("Vermieter");
    
        };
    
        that.getObjekt = getObjekt;
        that.getVermieter = getVermieter;
        that.getEinsteller = getEinsteller;
        that.init = init;
    
        return that;
    })();
    

    我试着答应了。但我想我不太明白这是怎么回事。甚至在查看了几个关于这个话题的博客之后。

    这是我的尝试:

    init = function() {
            console.log("init Detail.js");
    
            setupParse();
    
            getData().then(function(){
                console.log(einstellerData);
                console.log(vermieterData);
    
                $(that).trigger("setWohnungsDetails");
            });
    
            return that;
        },
    
        getData = function() {
    
            var promise = new Promise();
    
            getObjektData(function(einsteller, vermieter){
                getVermieterData(vermieter);
                getEinstellerData(einsteller);
            });
    
            promise.resolve();
    
            return promise;
        },
    

    有人能帮帮我,告诉我我在这里有什么误解吗?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Halcyon    11 年前

    我猜 queryObjekt.get 在里面 getObjektData 是异步的,而 getData 期望 getObjectData 立即。

    如果您在连接异步事件及其结果数据时遇到问题,我建议您了解promise的概念。寻找承诺/A或失败。有了promise,您不必一直传递回调,而是有一个最终具有值的中间promise对象。您将回调添加到promise,而不是生成promise的函数。