【问题标题】:Promise doesn't work in Javascript, Returns undefinedPromise 在 Javascript 中不起作用,返回未定义
【发布时间】:2013-10-21 06:48:02
【问题描述】:

我想从 Parse.com 获取数据并在加载所有数据后触发一个事件。 方法 getEinstellerDatagetObjektDatagetVermieterData 包含对 parse.com 数据库的异步查询。查询中的对象被正确检索。

我根据以下代码编写了该代码: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]

知道我在这里可能做错了什么吗!?

提前致谢 ;)

【问题讨论】:

  • promise 未定义,因为您从未将其设置为等于任何值。 getObjektData 不返回任何内容。
  • 取决于你想要做什么......
  • 这些函数都没有任何远程接近 Promise 对象的东西,你必须创建和解决你自己的 Promise。
  • 你得到的错误发生在这里:queryObjekt.get( 因为queryObjekt 是未定义的。
  • 首先完成 'getObjektData' 然后完成 'getVermieterData' 和 'getEinstellerData' 最后当所有 3 个函数都完成并且数据写入全局变量时,我希望事件触发。

标签: javascript jquery undefined parse-platform promise


【解决方案1】:

我不熟悉您正在使用的库,但看起来您正在混合使用可以一起使用的回调和承诺,但您必须小心。例如,

queryEinsteller.first({ 
   ...
});

将立即返回,导致在调用 successerror 成员之前解析 combinedPromise。您需要做的是创建一个在调用successerror 时解决的promise。然后,您可以从 getEinstellerData 返回该承诺。你需要在getVermieterData 中做同样的事情。

有关如何执行此操作的示例,您应该研究您引用的网页中标题为“将其与 $.Deferred 放在一起”的部分中的示例。

【讨论】:

    【解决方案2】:

    queryObject.get(..) 的调用将返回一个承诺,如果您想允许链接,那么您需要从您的函数中返回该值,即

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

    基本上只需将 return 语句添加到您的调用中,在您的其他函数中执行相同操作。

    问题是您是否希望第一个查询在您开始第二个查询之前完成,并且第三个与第二个查询相同(即以下查询需要来自先前查询的数据),或者您是否希望所有三个查询都启动并只做某事什么时候完成?

    一旦你为我回答了这个问题,我会用示例更新这个问题。

    【讨论】:

    • 我希望“getObjektData”首先完成,因为它会检索我想从其他 2 个查询中获取的对象的 ID。这两个可能同时发生。
    猜你喜欢
    • 2018-02-24
    • 2017-10-31
    • 2020-10-03
    • 2017-09-22
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多