0

私は Javascript でコールバック関数を使用することにかなり慣れていません。コールバックが私の問題であるかどうかもわかりません。

データベースからいくつかのデータを取得し、.push メソッドを使用してオブジェクトに保存したいと考えています。

そこにプッシュした後、このオブジェクトをログに記録すると、正しいデータがログに記録されます。したがって、データベース接続が問題になることはありません。

私はちょっとしたモデル - ビュー - コントローラーモデルで作業しており、コントローラーがモデルからビューコンポーネントにデータを渡すことを望んでいます。Models get-method を試すと、空のオブジェクトが返されます。

getData() が呼び出される init-function でわかるように、ログを記録してデータが失われる場所を見つけようとしました。このログはすでに「未定義未定義」を返しています。

なぜこれが起こるのか、誰かが私のコールバックメソッドの使用法などの主な誤解を見ているのですか?

ここで助けていただければ幸いです。

前もって感謝します ;)

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;
})();

Promiseでやってみました。しかし、私はこれがどのように機能するかを正確に理解していないと思います。このトピックに関するいくつかのブログをチェックした後でも。

これが私の試みです:

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;
    },

誰かが私を助けて、私がここで誤解したことを教えてもらえますか?

4

1 に答える 1

1

queryObjekt.getingetObjektDataは非同期であると推測していますが、即時であるgetDataと予想されます。getObjectData

非同期イベントとその結果データのリンクに問題がある場合は、Promise の概念を確認することをお勧めします。Promises/A または Deferreds を探します。promise を使用すると、常にコールバックを渡す必要はありません。代わりに、最終的に値を持つ中間の promise オブジェクトがあります。promise を生成する関数ではなく、promise にコールバックを追加します。

于 2013-10-18T14:07:09.033 に答える