[英]Resolve promises inside setTimeout function in for-loop
我想通过javascript / angular js 1.x在一定间隔内调用Web api。 我必须这样做,因为我正在调用的Web API限制了每300秒的调用次数。
请在下面找到我试图使其工作的代码。 RecordList
是我需要通过webapi调用传递的对象列表。 setDelay
是使用setTimeout
函数将延迟添加到每个调用的函数。
在setTimeout
函数中,我正在调用webapi,它正在成功创建记录。 我想要一个对象或事件或一段代码,这些代码可以让我知道是否成功创建了所有记录。 这意味着如何知道setTimeout
函数内部的所有promise是否已解决。 我知道Promise.all
和$q.all
用法,但它们似乎无法与setTimeout
函数一起使用。 您能为此建议些吗?
var waitInterval = 300;
var promiseArray = [];
function setDelay(obj, s) {
setTimeout(function() {
var SomePromise = $http.post('odataURI', obj).then(function success(result) {
//resolve(result);
});
promiseArray.push(SomePromise);
}, waitInterval * s);
}
for (var s = 1; s <= RecordList.length; s++) {
setDelay(RecordList[s - 1], s);
}
您可以使用递归函数在一个完成后运行下一个promise。
function post(n) { return Promise.resolve(n); } function setDelay(n, milliseconds) { return new Promise(function(resolve, reject) { setTimeout(function() { post(n).then(function(res) { resolve(res); }); }, milliseconds) }) } function call(list, delay = 1000, index = 0, result = []) { setDelay(list[index], delay).then( function(res) { console.log(res); result.push(res); if (index == list.length - 1) { console.log('Result: ', result); // You can do something here return result; } else { return call(list, delay, index + 1, result); } } ); } var RecordList = [1, 2, 3, 4, 5]; call(RecordList);
您可以使用async
await
var waitInterval = 300;
var promiseArray = [];
async FunctionOfLoop() {
var dataMain;
for (var s = 1; s <= RecordList.length; s++) {
dataMain = await setDelay(RecordList[s - 1], s); // here you will get the data after api consume successfully.
}
}
function setDelay(obj, s) {
return new Promise ((resolve, reject) => {
setTimeout(function() {
var SomePromise = $http.post('odataURI', obj).then(function success(result) {
resolve(result);
});
}, waitInterval * s);
});
}
希望对您有所帮助。
没有递归也有可能
var waitInterval = 300; var promiseArray = []; var tick =0; function setDelay(obj, s) { setTimeout(function() { var SomePromise = Promise.resolve(obj); SomePromise.then(function success(result) { tick ++; console.log(result); if ( tick === RecordList.length) { Promise.all(promiseArray).then((res) => { console.log(res); }); } }); promiseArray.push(SomePromise); }, waitInterval * s); } var RecordList = [1,2,3,4,5]; for (var s = 1; s <= RecordList.length; s++) { setDelay(RecordList[s - 1], s); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.