javascript-在for循环结束时进行承诺调用

javascript-在for循环结束时进行承诺调用,javascript,arrays,parse-platform,cloud,promise,Javascript,Arrays,Parse Platform,Cloud,Promise,我有这段代码,我想让代码等到称为prom的异步查询完成后,再重新启动第一个for循环。因此,在再次启动第一个for循环之前,阵列将被重置 items = []; var promises = []; for (var i = 0; i < userArray.length; i++) { items.length = 0; for (var i2 = 0; i2 < test.length; i2++) { var

我有这段代码,我想让代码等到称为prom的异步查询完成后,再重新启动第一个for循环。因此,在再次启动第一个for循环之前,阵列将被重置

items = [];
var promises = [];
    for (var i = 0; i < userArray.length; i++) {

        items.length = 0;
        for (var i2 = 0; i2 < test.length; i2++) {

            var UserFavourite = Parse.Object.extend("UserFavourite");
            var queryUserFav = new Parse.Query(UserFavourite);
            queryUserFav.equalTo('item', test[i2].get('item'));
            queryUserFav.equalTo('school', test[i2].get('school'));
            queryUserFav.equalTo('user1', userArray[i])
            var prom = queryUserFav.find().then(function(res) {


                    for (var i3 = 0; i3 < res.length; i3++){
                        var item = res[i3];
                        var itemName = item.get('item');
                        items.push(itemName);
                        console.log(items)

                    }
                    return items;


            });
            promises.push(prom);

        }
        //return Parse.Promise.when.apply(Parse.Promise, promises); I have tried it here but
        // this just stops the first for loop after its first loop

    }
    return Parse.Promise.when.apply(Parse.Promise, promises);

你要做的是有一个承诺链,一个数组中的每个项目都有一个承诺链

如果javascript有一个与.NET的wait关键字相当的关键字,那就太好了

 await Parse.Promise.when(promises)
然后它允许promise代码运行,然后在等待之后返回运行任何代码。但是Javascript并没有给我们这些

另一种方法是维护索引变量。处理每一组查询后,递增索引变量并处理下一组值

 function parseForUser(user) {
      var promises = [];
      for (var i2 = 0; i2 < test.length; i2++) {
        var items = [];
        var UserFavourite = Parse.Object.extend("UserFavourite");
        var queryUserFav = new Parse.Query(UserFavourite);
        queryUserFav.equalTo('item', test[i2].get('item'));
        queryUserFav.equalTo('school', test[i2].get('school'));
        queryUserFav.equalTo('user1', user)
        var prom = queryUserFav.find().then(function(res) {
                for (var i3 = 0; i3 < res.length; i3++){
                    var item = res[i3];
                    var itemName = item.get('item');
                    items.push(itemName);
                    console.log(items)

                }
                return items;
        });
        promises.push(prom);
      }
      return Parse.Promise.when(promises);

 }


 function parseUserArray(userArray) {
     var returnPromise = new Parse.Promise(); // Do you have to call it via new? 
                                              //The documentation isn't clear.
     var index = 0;
     var doNext = function() {
         if(index < userArray.length) {
            var promise = parseForUser(userArray[index++]);
            promise.done(doNext);
         } else {
             returnPromise.resolve(); 
         }
     }
     doNext();
     return returnPromise;
 }

 var parseUserArrayPromise = parseUserArray(userArray);
FWIW

此解决方案与@AndrewShepherd的不同之处主要在于,这里我们双重利用了asyncProcessUser返回的承诺

首先是流量控制——内部循环的异步排序 其次,用于交付结果数组,从中构建最终结果数组,避免了对外部数组的需要。 函数parseUserArrayuserArray,测试{ //此函数是原始的内部for循环,现在表示为.map, //加上外围包装和链接。 //它针对所有测试项异步处理单个用户, //并返回一个结果数组的承诺。 //当所有的个体都找到完成的时候,承诺就解决了。 函数asyncProcessUseruser{ 返回Parse.Promise.whentest.mapfunctiondataItem{ 返回新的Parse.QueryParse.Object.extendUserVavourite .equalTo'item',dataItem.get'item' .equalTo'school',数据项。获取'school' .equalTo'user1',user .find.then函数{ 返回res.MapFunction{ 返回r.get'item'; }; }; }.Then函数{ 返回Array.prototype.slice.applyarguments.reducefunctionarr,arr\u{ 返回arr.concatarr; }, []; }; } //这是原始的外部for循环,现在表示为.reduce,即 //执行一系列异步任务的通用模式,即什么是内部循环。 //这里,`userArray.reduce…`返回一个 //上面的'r.get'item'返回的对象。 返回userArray.reduce functionp,用户{ 返回p.r{ 返回asyncProcessUseruser.thenfunctionarr\u{ 返回arr.concatarr; }; }; },Parse.Promise.as[];/†返回一个用给定值解析的新承诺。 } †:

没有评论,它相当简洁

对这一概念进行了论证。不要担心演示使用jQuery承诺,重要的是这个概念。

使用这个

function parseForUser(user) {
      var promises = [];
      for (var i2 = 0; i2 < test.length; i2++) {
        var items = [];
        var UserFavourite = Parse.Object.extend("UserFavourite");
        var queryUserFav = new Parse.Query(UserFavourite);
        queryUserFav.equalTo('item', test[i2].get('item'));
        queryUserFav.equalTo('school', test[i2].get('school'));
        queryUserFav.equalTo('user1', user)
        var prom = queryUserFav.find().then(function(res) {
                for (var i3 = 0; i3 < res.length; i3++){
                    var item = res[i3];
                    var itemName = item.get('item');
                    items.push(itemName);
                    console.log(items)

                }
                return items;
        });
        promises.push(prom);
      }
      return Parse.Promise.when(promises);

 }


 function parseUserArray(userArray) {
     var returnPromise = new Parse.Promise(); // Do you have to call it via new? 
                                              //The documentation isn't clear.
     var index = 0;
     var doNext = function() {
         if(index < userArray.length) {
            var promise = parseForUser(userArray[index++]);
            promise.done(doNext);
         } else {
             returnPromise.resolve(); 
         }
     }
     doNext();
     return returnPromise;
 }

只需复制并粘贴

我的查询取决于变量i如何在您未声明我时所说的位置调用它?@spenf-您的查询实际上并不取决于变量i,而是取决于userArray[i]中的用户。请注意,此代码parseForUser将用户对象作为参数。好的,我只是对如何输入查询代码有点困惑?@spenf-我已经在代码示例中包含了这一点。请注意,我没有对此进行测试,它只是为您提供了解决问题的方法。一些描述解决方案中的总体思路的文本将使您的答案成为更好的答案。