想要在回调中更新对象,给出正确的日志,但全局对象未更新

Want to update Object in Callback, gives correct log, but global Object is not updated

本文关键字:更新 对象 日志 全局 回调      更新时间:2023-09-26

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

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

将其推入那里后,我记录此对象并记录正确的数据。因此,数据库连接不会成为问题。

我正在使用一种模型-视图-控制器模型,并希望控制器将数据从模型传递到视图组件。如果我尝试模型获取方法,我会得到一个空对象。

我试图通过日志记录找出数据丢失的位置,正如您在调用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;
    },

谁能帮我,告诉我我在这里误解了什么?

我猜getObjektData中的queryObjekt.get是异步的,而getData希望getObjectData是即时的。

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