javascript - 在 for 循环中解决 setTimeout 函数内的 promise

标签 javascript angularjs http promise settimeout

我想通过 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/

相关文章:

javascript - 用于查找与选择器匹配的给定元素之后的第一个元素的 jQuery 选择器

javascript - 为什么 VueJS 检测到这个属性被添加到数组中的对象?

javascript - 使用 ng-animation-swap 进行两个方向的动画交换

c# - 如何为我的应用程序设置默认浏览器?

javascript - 使用 fetch 获取页面设置

javascript - 输入文本更改时提交表单

javascript - 停止 ng-view 内的 Angular 路由链接

angularjs - 使用 Generator-Angular-FullStack 构建 Heroku 应用程序失败

java - 服务请求后停止 HttpServer

wcf - 返回一个裸 JSON 字符串