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

时间:2019-06-04 09:06:51

标签: javascript angularjs http promise settimeout

我想通过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);
}

3 个答案:

答案 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);
}