Promise 在 Javascript 中不起作用,返回未定义
Promise doesn't work in Javascript, Returns undefined
我想从 Parse.com 获取数据并在加载完所有数据后触发事件。方法getEinstellerData
、getObjektData
和getVermieterData
包含对 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]
知道我在这里可能弄错了什么吗!?
提前致谢;)
熟悉您正在使用的库,但看起来您正在混合回调和承诺,它们可以一起使用,但您必须小心。例如
queryEinsteller.first({
...
});
将立即返回,导致在调用success
或error
成员之前解决combinedPromise
。您需要做的是创建一个在调用success
或error
时解析的承诺。然后,您可以从 getEinstellerData
返回该承诺。您需要在getVermieterData
中做同样的事情。
有关如何执行此操作的示例,您应该研究标题为"将其与 $ 放在一起。延迟",在您引用的网页中。
对 queryObject.get(..)
的调用将返回一个 promise,如果你想允许链接,那么你需要从你的函数中返回该值,即
getObjektData = function() {
// .. other code ..
return queryObjekt.get(objectId, {
success: /* .. your success handler .. */
error: /* .. your errror handler .. */
});
};
基本上,只需将该 return 语句添加到您的调用中,在其他函数中执行相同的操作。
问题是,您是否希望第一个查询在开始第二个查询之前完成,第三个查询与第二个查询也是如此(即后续查询需要来自先前查询的数据),还是希望启动所有三个查询并在它们全部完成后执行某些操作?
一旦你为我回答了这个问题,我将用样本更新这个问题。
- 这.SOMETHING 总是返回未定义的 - extjs
- React+Meteor:this.ops返回未定义
- 解析-为什么user.getSessionToken()返回未定义的结果
- Javascript函数返回未定义
- JavaScript-获取数据属性的值返回未定义的值
- .val()返回未定义的.text返回随机代码
- 为什么innerHTML返回“未定义”
- "这个“;正在返回未定义的
- 谷歌地图:函数返回未定义的值在console.log中运行良好
- Javascript json返回未定义
- importScripts在web工作程序中返回未定义的
- 访问嵌套 json 对象的属性将返回未定义
- NativeAppEventEmitter返回未定义的
- 我的函数返回“未定义”
- 新手Javascript函数返回未定义的石头剪刀游戏
- Nodejs模块函数返回未定义的,而不是异步的
- .getElementById在.createTextNode中返回未定义
- javascript函数不返回未定义的值
- Typeahead的Javascript类型返回未定义
- Javascript可见元素返回未定义