想要在回调中更新对象,给出正确的日志,但全局对象未更新
Want to update Object in Callback, gives correct log, but global Object is not updated
我对在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 对象。您将回调添加到承诺,而不是生成承诺的函数。
相关文章:
- 如何在 Firebase 的 Angular-Fire 中使用 $save() 来更新对象属性值
- Expressjs&集合中的MongoDB更新对象's数组
- Physijs更新对象质量
- 如何使用setAttribute更新对象中的一个值
- 在分析中创建或更新对象
- 从knockout.js中的下拉列表更新对象
- Grails richui自动完成将对象传递给函数或更新对象ID
- 我正在使用 $scope.$apply 在 http 调用后更新对象数组.谁能告诉我正确的方法
- 如何使用 AngularJS 根据选择更改更新对象数组
- 从新对象的属性更新对象的属性,但前提是新对象上的属性不是未定义的
- 角度.js从NG重复更新对象数据
- 删除 JavaScript 中的重复代码;更新对象传递到函数中
- javascript:通过递增 objectKeys 值来更新对象
- 根据输入更新对象数组
- 想要在回调中更新对象,给出正确的日志,但全局对象未更新
- 流星:如果值等于 X,则更新对象 1,否则更新对象 2
- 如何在 Javascript 中更新对象数组中每个对象的值
- 嵌套的 ng-repeat 不会更新对象
- 使用从 MongoDB 获取的新数据更新对象属性
- 按 $parent.$index 和$index更新对象$scope项