我想通过javascript / angular js 1.x在一定间隔内调用Web api。我必须这样做,因为我正在调用的Web API限制了每300秒的调用次数。
请在下面找到我正在尝试使其工作的代码。
RecordList
是我需要通过webapi调用传递的对象列表。
setDelay
是使用setTimeout
函数为每次通话增加延迟的函数。
在setTimeout
函数中,我正在调用webapi,它正在成功创建记录。我想要一个对象或事件或一段代码,这些代码可以让我知道是否成功创建了所有记录。这意味着如何知道setTimeout
函数内部的所有诺言是否已经解决。我知道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);
}
答案 0 :(得分:2)
您可以使用递归函数在完成后运行下一个诺言。
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);
答案 1 :(得分:1)
您可以将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);
});
}
希望它能对您有所帮助。
答案 2 :(得分:1)
没有递归也是可能的,
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);
}