Javascript Parse.com串联承诺
我正在尝试拍摄照片对象的列表,并根据拍摄日期将其分配给画廊。诀窍在于,在流程执行之前,可能根本没有图库(即,当代码遇到当天拍摄的照片时,需要为没有图库的一天生成一个新的图库) 这是我的密码:Javascript Parse.com串联承诺,javascript,parse-platform,promise,chaining,Javascript,Parse Platform,Promise,Chaining,我正在尝试拍摄照片对象的列表,并根据拍摄日期将其分配给画廊。诀窍在于,在流程执行之前,可能根本没有图库(即,当代码遇到当天拍摄的照片时,需要为没有图库的一天生成一个新的图库) 这是我的密码: var Photo = Parse.Object.extend("Photo"); var Gallery = Parse.Object.extend("Gallery"); var query = new Parse.Query(Photo); query.equalTo("owner", Parse.
var Photo = Parse.Object.extend("Photo");
var Gallery = Parse.Object.extend("Gallery");
var query = new Parse.Query(Photo);
query.equalTo("owner", Parse.User.current());
query.find().then(function(results) {
// Create a trivial resolved promise as a base case.
var promise = Parse.Promise.as();
for (photo in results)
{
var photoObject = results[photo];
//Closure to encapsulate the photo object represented by this loop iteration
//(function(photo) {
promise = promise.then((function(photo) {
console.log('iterator: ' + photo.id);
var takenAt = photo.get("takenAt");
var dd = takenAt.getDate();
var mm = takenAt.getMonth()+1; //January is 0!`
var yyyy = takenAt.getFullYear();
var dateOf = new Date(yyyy+"-"+mm+"-"+dd);
var query = new Parse.Query(Gallery);
query.equalTo("owner", Parse.User.current());
query.equalTo("dateOf", dateOf);
query.find().then(function(galleries) {
console.log("Galleries:"+galleries.length);
if (galleries.length > 0)
{
photo.addUnique("galleries",galleries[0]);
photo.save();
}
else
{
var gallery = new Gallery();
gallery.set("owner",Parse.User.current());
gallery.set("dateOf",dateOf);
return gallery.save();
}
}).then(function(gallery) {
//Finished new gallery save!
photo.addUnique("galleries",gallery);
photo.save();
});
})(photoObject));
}
return promise;
//console.log(photo.get("takenAt"));
}).then(function() {
// Every photo was added to the proper gallery.
});
问题是,当它运行时,我得到以下输出(在后端运行Express/Node.js服务器,这是控制台输出):
因此,您可以看到,第一个正在创建的图库是在检查了所有照片之后创建的,问题是它在同一天创建了8个图库(示例集中的所有照片都是在同一天拍摄的)
看起来这些承诺并不像我预期的那样一系列地执行。如何强制这些调用按顺序进行,以便在第一个照片查找完成创建图库之前(如果需要)不会进行第二个照片查找?然后
知道如何等待下一项的方法是使用返回值-无论何时执行异步操作-如果要等待它完成,您应该返回它。就是这样!在解析框架内还需要一些其他的工作,但这是关键。对于那些找到它的人,需要返回内部的“query.find()”链接承诺,以便它正确地跟踪它们。此外,我还合并了u.each()构造,而不是上面的原始闭包,因为解析后端提供了由闭包触发的堆栈跟踪(我不知道为什么)。这是有意义的——文档也会调用它:“如果回调本身返回一个承诺,那么返回的是”然后“在回调返回的函数完成之前,将不会完成。”
I2014-10-03T19:08:24.934Z]iterator: bZJ1Ke0QXO
I2014-10-03T19:08:24.936Z]iterator: 6li2Ztxhrd
I2014-10-03T19:08:24.937Z]iterator: FfUCwgNsts
I2014-10-03T19:08:24.937Z]iterator: fJdAeqCwYW
I2014-10-03T19:08:24.939Z]iterator: ChUmgipm7d
I2014-10-03T19:08:24.942Z]iterator: 9MiTFHxLzh
I2014-10-03T19:08:24.942Z]iterator: bWZAbNiNB2
I2014-10-03T19:08:24.943Z]iterator: RQqe3NyAxK
I2014-10-03T19:08:24.991Z]Galleries:0
I2014-10-03T19:08:25.043Z]Galleries:0
I2014-10-03T19:08:25.045Z]Galleries:0
I2014-10-03T19:08:25.095Z]Galleries:0
I2014-10-03T19:08:25.146Z]Galleries:0
I2014-10-03T19:08:25.147Z]Galleries:0
I2014-10-03T19:08:25.253Z]Galleries:0
I2014-10-03T19:08:25.305Z]Galleries:0