延迟这个Javascript FOR Loop

Delay this Javascript FOR Loop

本文关键字:FOR Loop Javascript 延迟      更新时间:2023-09-26

LOOP查询 Parse.com 服务器,然后播放结果(如果有)。问题是,当nArray大于 100 时,函数超过了 CloudCode Parse.com 查询/突发限制,并且失败。

一个想法是在每 100 LOOPS后将LOOP延迟一秒钟,但我不确定该怎么做。任何其他解决方案将不胜感激。

提前致谢,

 for (var k = 1; k < nArray.length; k++) {
     (function (k, mArray) { // <-- define an inline function
         query2.equalTo("username", nArray[k]); // BURST LIMIT EXCEEDS
         query2.find({
             success: function (results) {

                 if (results.length !== 0) {
                     var object = results[0];
                     var compareUserEmail = object.get('email');
                     if (compareUserEmail !== userEmail) {
                         // alert("The result is equal to" + object.get('Name'));

                         mArray.push({
                             name: object.get('Name'),
                             email: object.get('email'),
                             bloxID: object.get('bloxID')
                         });

                         gameScore.set("filtered", mArray);
                         gameScore.save(null, {
                             success: function (gameScore) {
                                 response.success("Success!");
                                 alert('New object created with objectId: ' + gameScore.id);
                             },
                             error: function (gameScore, error) {
                                 alert('Failed to create new object, with error code: ' + error.description);
                             }
                         });
                     }
                 };
             },
             error: function () {}
         });
     })(k, mArray);
     // <-- call it after definition using (k)

 };

你有几个问题要处理。

Parse.com 不支持setInterval的原因是因为那会招致灾难。如果花费的时间过长,它会终止您的云代码,因此让您添加延迟只会增加您的代码在完成之前终止的机会。

Parse.com 有突发限制的原因是,这通常表明"你做错了(tm)"。在您的情况下,您正在循环访问数组并为数组中的每个项目运行查询。相反,您应该使用 containedIn 方法一次性获取数组的所有记录。如果您的数组中有超过 100 个项目,您可以选择将记录限制增加到 1000,但首先要仔细考虑这是否真的是您需要的。

鉴于您要修改大量对象并将它们全部保存,请考虑使用 saveAll 方法一次性保存所有对象。

您可能需要考虑对这些操作进行批处理,但请注意对云代码总体持续时间的限制。

您可以使用

setInterval

var i = 0;
var intervalId = setInterval(function() {
    if(i < nArray.length) {
        ... your code ...
        i++;
    } else {
        clearInterval(intervalId);
    }
}, 100); //every 100ms; change it to what you need