javascript - 公共(public)变量未正确更改

标签 javascript variables return parse-platform public

对不起,如果这是一个已经存在的主题,但我真的不知道我应该真正搜索什么来解决我的问题。

我尝试在函数 getHighestObjectId 中从函数内的 Parse.com 数据库接收 Id:

Einstellen.js:

EinstellenStart.Einstellen = (function() {
    var that = {},

    anbieterId = null,
    vermieterId = null,
    objektId = null,

    writeObjekt = function(objekt, o_id, a_id, v_id) {
        console.log(objekt.ort);

        var objektData = Parse.Object.extend(objekt.ort);
        var newObjekt = new objektData();


                newObjekt.set("Strasse", objekt.strasse);
                newObjekt.set("Hausnummer", parseInt(objekt.hausnummer));
                newObjekt.set("PLZ", parseInt(objekt.plz));
                //newObjekt.set("Ort", objekt.ort);
                newObjekt.set("ID", o_id);
                newObjekt.set("Einsteller_id", a_id);
                newObjekt.set("Vermieter_id", v_id);
                newObjekt.set("Miete", parseInt(objekt.miete));
                newObjekt.set("Nebenkosten", parseInt(objekt.nebenkosten));
                newObjekt.set("Kaution", parseInt(objekt.kaution));
                newObjekt.set("Flaeche", parseInt(objekt.flaeche));
                newObjekt.set("Zimmer", parseInt(objekt.zimmer));
                newObjekt.set("Freitext", objekt.freitext);
                newObjekt.set("Gesamtmiete", parseInt(objekt.miete+objekt.nebenkosten));


                newObjekt.save(null, {
                  success: function(newObjekt) {
                    console.log("Successfully created " + newObjekt);
                  },
                  error: function(newObjekt, error) {
                    // Execute any logic that should take place if the save fails.
                    // error is a Parse.Error with an error code and description.
                    alert('Failed to create new object, with error code: ' + error.description);
                  }
                });


    },



    writeAnbieter = function(anbieter, a_id) {

        var newAnbieter = new anbieterData();



                newAnbieter.set("Vorname", anbieter.vorname.toString());
                newAnbieter.set("Nachname", anbieter.nachname.toString());
                newAnbieter.set("Strasse", anbieter.strasse.toString());
                newAnbieter.set("Hausnummer", parseInt(anbieter.hausnummer));
                newAnbieter.set("PLZ", parseInt(anbieter.plz));
                newAnbieter.set("Ort", anbieter.ort.toString());
                newAnbieter.set("Telefon", parseInt(anbieter.telefon));
                newAnbieter.set("Email", anbieter.email.toString())
                newAnbieter.set("ID", a_id);

                newAnbieter.save(null, {
                  success: function(newAnbieter) {

                  },
                  error: function(newAnbieter, error) {
                    // Execute any logic that should take place if the save fails.
                    // error is a Parse.Error with an error code and description.
                    alert('Failed to create new object, with error code: ' + error.description);
                  }
                });


    },

    writeVermieter = function(vermieter, a_id) {

        var newVermieter = new vermieterData();



                newVermieter.set("Vorname", vermieter.vorname.toString());
                newVermieter.set("Nachname", vermieter.nachname.toString());
                newVermieter.set("Strasse", vermieter.strasse.toString());
                newVermieter.set("Hausnummer", parseInt(vermieter.hausnummer));
                newVermieter.set("PLZ", parseInt(vermieter.plz));
                newVermieter.set("Ort", vermieter.ort.toString());
                newVermieter.set("Telefon", parseInt(vermieter.telefon));
                newVermieter.set("Email", vermieter.email.toString())
                newVermieter.set("ID", a_id);

                newVermieter.save(null, {
                  success: function(newVermieter) {

                  },
                  error: function(newVermieter, error) {
                    // Execute any logic that should take place if the save fails.
                    // error is a Parse.Error with an error code and description.
                    alert('Failed to create new object, with error code: ' + error.description);
                  }
                });

    },

    getHighestObjektId = function(objekt, callback) {

        var objektData = Parse.Object.extend(objekt);

        var id__objekt_query = new Parse.Query(objektData);

        id__objekt_query.exists("ID");
        id__objekt_query.descending("ID");
        id__objekt_query.first({
          success: function(object) {

            callback(parseInt(object.get('ID')) + 1);
            //objektId = parseInt(object.get('ID')) + 1;
            console.log(objektId);

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



        console.log(objektId);

        return objektId;

    },

    getHighestAnbieterId = function() {

        var id__anbieter_query = new Parse.Query(anbieterData);

        id__anbieter_query.exists("ID");
        id__anbieter_query.descending("ID");
        id__anbieter_query.first({
          success: function(object) {

            anbieterId = parseInt(object.get('ID')) + 1;


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

        console.log("anbieter:" + anbieterId);

        return anbieterId;
    },

    getHighestVermieterId = function() {

        var id_vermieter_query = new Parse.Query(vermieterData);

        id_vermieter_query.exists("ID");
        id_vermieter_query.descending("ID");
        id_vermieter_query.first({
          success: function(object) {

            vermieterId = parseInt(object.get('ID')) + 1;


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

        return vermieterId;
    },



    setupParse = function() {
        Parse.initialize("REsOHm341bAXyLksjPxBq0AX0wfHs2DZVvZsjEEF", "9uQb8PLO8UZAG8rzWMxL0vGYdfaEd3zru6it73bS");

        anbieterData = Parse.Object.extend("Anbieter");
        vermieterData = Parse.Object.extend("Vermieter");



    },

    init = function() {
        console.log("init Einstellen.js")
        setupParse();
        getHighestAnbieterId();
        getHighestVermieterId();


        return that;
    };

    that.getHighestObjektId = getHighestObjektId;
    that.getHighestAnbieterId = getHighestAnbieterId;
    that.getHighestVermieterId = getHighestVermieterId;
    that.writeObjekt = writeObjekt;
    that.writeVermieter = writeVermieter;
    that.writeAnbieter = writeAnbieter;
    that.init = init;

    return that;
})();

我从另一个脚本调用了该函数:

EinstellenStart.EinstellenController = (function() {
    var that = {},
    einstellen = null,
    einstellenView = null,
    objektId = null,
    o_id = null,
    a_id = null,
    v_id = null,
    stadt = null,



    init = function() {

        einstellen = EinstellenStart.Einstellen.init();

        einstellenView = EinstellenStart.EinstellenView.init();
        $(einstellenView).on("setNewObject", onSetNewObject);


    },


    onSetNewObject = function(event) {

        v_id = einstellen.getHighestVermieterId();
        a_id = einstellen.getHighestAnbieterId();

        var anbieter = einstellenView.getAnbieterFormData();
        var vermieter = einstellenView.getVermieterFormData();
        var objekt = einstellenView.getObjektFormData();

        einstellen.getHighestObjektId(objekt.ort, function(o_id) {
            o_id = objektId;
            console.log(o_id + "onSetNewObject");
        });


        einstellen.writeAnbieter(anbieter, a_id);
        einstellen.writeVermieter(vermieter, v_id);
        einstellen.writeObjekt(objekt, o_id, a_id, v_id);

    };


    that.init = init;

    return that;
})();

现在是我的问题。值 objektId 已正确接收。 query.first 函数中的日志输出在控制台中返回正确的值。

但是第二个日志返回 null,整个函数也返回 null。 我只是不明白为什么公共(public)变量在函数中改变了,但之后又变成了 null。

有什么想法吗?

最佳答案

这是因为您正在处理的上下文的异步性质,调用在 success 回调中完成,重点是当第二个 console.log 被调用,调用可能尚未完成,因此,即使您在最顶层声明了 objektId,您仍然不会得到您期望的内容,而是您将其初始化为的值。

一个可能的答案是

getHighestObjektId = function(objekt, callback) {
  // your code...

    success: function(object) {
      callback(parseInt(object.get('ID')) + 1);
    }

  // rest of your code

你会这样调用它

getHighestObjektId(objekt, function(objektId) {
  // here you can deal with objektId
});

关于javascript - 公共(public)变量未正确更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18316269/

相关文章:

ios - 错误:“预期返回Int的函数中缺少返回”

javascript - 如何在 Safari 中声明类型化数组? (JavaScript)

javascript - 在 javascript 中选择特定子字符串后的 2 个字符

javascript - 获取表格中的行号并将其保存到php变量中

php - 如何从字符串中生成条件语句

C++ 一个 int 函数可以返回类似 "NULL"的东西吗?

c - 当函数体没有返回语句时内联

javascript - iframe 中的奇怪行为 history.back

javascript - 如何为 Google Chart 中的特定范围设置颜色?

JavaScript "takeown"函数?