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