繁体   English   中英

在for循环中解析setTimeout函数内部的promise

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM