gpt4 book ai didi

Javascript 超时循环将多行保存到 Parse.com

转载 作者:行者123 更新时间:2023-12-03 10:01:54 25 4
gpt4 key购买 nike

我在 parse.com 云代码中编写了一个 beforeSave 脚本。我想保存所有要解析的结果,以便它们都通过此脚本运行,并且在保存之前修改它们的数据。

我已经通过以下方式解决了这个问题。

  1. 从 Parse.com 仪表板导出 JSON。

  2. 在我的应用中将其用作本地 JSON 并运行以下循环:

代码:

$http.get('data/full_data.json')
.then(function(res) {
var counter = 0;
for (var i = 0; i < res.data.results.length; i++) {
setDelay(counter);
saveToParse(res.data.results[i]);
counter ++
};
}
});

function setDelay(i) {
setTimeout(function() {
console.log(i);
}, 1000);
}

function saveToParse(exercise) {

console.log(exercise);
ParseFactory.provider('Exercises/').edit(exercise.objectId, exercise).success(function(data) {

}).error(function(response) {
$ionicLoading.hide();
$rootScope.$emit('errorEvent', {
"message": "Please check your connection",
"errorObject": response
});
});
}

我一直在尝试设置超时功能,这样我就不会超过 Parse.com 上允许的 API 调用次数。

我的问题是,我所有的 API 调用都已完成,然后在 1 秒暂停后,它在最后很快就运行超时。

如何确保每次循环迭代在再次循环之前都超时。

<小时/>

答案在前 50 秒内工作正常,然后慢慢工作......请参阅此网络事件的屏幕截图。

network trace

最佳答案

您可以让所有函数返回 promise 。为了使循环异步,您可以将其转换为递归“循环”。

$http.get('data/full_data.json')
.then(function(res) {
function loop(i) {
if(i < res.data.results.length) {
return saveToParse(res.data.results[i]).then(function() {
return delay(100);
}).then(function() {
return loop(i + 1);
});
}
else return Promise.resolve(res);
};
return loop(0);
}).then(function(res) {
console.log("finished saving");
});



function delay(time) {
return new Promise(function(resolve, reject) {
setTimeout(resolve, time);
});
}

function saveToParse(exercise) {
return new Promise(function(resolve, reject) {
console.log(exercise);
ParseFactory.provider('Exercises/').edit(exercise.objectId, exercise)
.success(resolve).error(function(response) {
var error = {
"message": "Please check your connection",
"errorObject": response
};
reject(error);
$ionicLoading.hide();
$rootScope.$emit('errorEvent', error);
});
});
}

编辑:然而,这样做可能会更好。它的优点是返回一个 promise ,这样你就可以继续链接你的 promise 。

$http.get('data/full_data.json')
.then(function(res) {
var p = Promise.resolve();
res.data.results.forEach(function(elem) {
p = p.then(function() {
return saveToParse(elem).then(function() {
return delay(100);
});
});
});
return p;
});

编辑2:另一种通用化异步循环的解决方案。

function asyncWhile(cond, body) {
if(cond()) {
return body().then(function() {
return asyncWhile(cond, body);
});
} else {
return Promise.resolve();
}
}

function asyncFor(start, end, body) {
var i = start;
return asyncWhile(function() {return i < end}, function() {
return body(i++);
});
}

$http.get('data/full_data.json')
.then(function(res) {
return asyncFor(0, res.data.results.length, function(i) {
return saveToParse(res.data.results[i]).then(function() {
return delay(100);
});
}).then(function() {
return res;
});
}).then(function(res) {
console.log("finished saving");
});

关于Javascript 超时循环将多行保存到 Parse.com,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com