我想通过 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 完成后运行下一个 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);
关于javascript - 在 for 循环中解决 setTimeout 函数内的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56440767/