Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
承诺不';不能在Javascript中工作,返回未定义的_Javascript_Jquery_Undefined_Parse Platform_Promise - Fatal编程技术网

承诺不';不能在Javascript中工作,返回未定义的

承诺不';不能在Javascript中工作,返回未定义的,javascript,jquery,undefined,parse-platform,promise,Javascript,Jquery,Undefined,Parse Platform,Promise,我想从Parse.com获取数据,并在加载所有数据后触发事件。 方法getEinstellerData、getObjektData和getverimeterdata包含对parse.com数据库的异步查询。正确检索查询中的对象 我根据以下内容编写代码: 我现在的问题是,var combinedPromise=$.when(getVerimeterData(verimeterId),getEinstellerData(einstellerId))似乎没有定义 我有以下函数来获取数据: getDat

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

我根据以下内容编写代码:

我现在的问题是,
var combinedPromise=$.when(getVerimeterData(verimeterId),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]
你知道我这里可能出了什么错吗


提前感谢;)

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

queryEinsteller.first({ 
   ...
});
将立即返回,导致在调用
成功
错误
成员之前解决
组合承诺
。您需要做的是创建一个承诺,该承诺在调用
success
error
时得到解决。然后,您可以从
getEinstellerData
返回该承诺。您需要在
getVerimeterData
中执行相同的操作


有关如何执行此操作的示例,您应该学习参考网页中标题为“将其与$.Deferred组合在一起”的部分中的示例。

调用
queryObject.get(…)
将返回一个承诺,如果您希望允许链接,则需要从函数返回该值,即

getObjektData = function() {
    // .. other code ..
    return queryObjekt.get(objectId, {
        success: /* .. your success handler .. */
        error: /* .. your errror handler .. */
    });
};
基本上,只需将return语句添加到调用中,在其他函数中也可以这样做

问题是,您希望在启动第二个查询之前完成第一个查询,第三个查询与第二个查询相同(即,以下查询需要来自先前查询的数据),还是希望启动所有三个查询,并在它们全部完成后执行某项操作


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

promise
未定义,因为你从未将它设置为任何值
GetObJetData
不返回任何内容。这取决于您尝试执行的操作…这些函数中没有任何函数与承诺对象有任何远程接近,您必须创建并解决自己的承诺。您在此处遇到的错误是:
queryObjekt.get(
因为
queryObjekt
是未定义的。首先完成'GetObjeTData',然后完成'GetVerimeterData'和'getEinstellerData',最后当所有3个函数都完成并且数据写入全局变量时,我希望触发事件。我希望'GetObjeTData'首先完成,因为它会检索ID对于我想从另外两个查询中得到的对象,这两个查询可能同时发生。