【问题标题】:Promises while loop, how to? [duplicate]承诺while循环,怎么做? [复制]
【发布时间】:2017-01-12 23:03:13
【问题描述】:

我需要对 API 进行一些连续调用,直到请求限制完成。在每个请求之后,都会将一些内容保存到数据库中,并且下一个请求取决于从第一个请求中检索到的值,因此在前一个请求完成之前,每个请求都无法启动。

普通的 while 循环不起作用,因为它会以并行的方式运行所有的 Promise。并且相互连接的 Promise 仅适用于固定数量的请求。

那么,如何实现一个 Promise while 循环呢?

基本上是我想要的:

let remaining = 200;
let start_id = null;

while (remaining > 0) {
  // make http request with param start_id
  // save results to db
  // update 'update' start_id
  // update 'remaining' from http header
}

【问题讨论】:

  • 你是否必须在你的下一个承诺中使用回调从一个早期的承诺?
  • 用递归函数代替while循环怎么样?
  • @redned,不会遇到内存问题吗?嗯,我想不会,不错的建议
  • 链式承诺有限制吗?不过,我还没有尝试过 200 条链。
  • 我认为 200 次递归调用不会有问题。当我需要提出一个加载系统时,它起作用了,但我总共只有大约 5-10 个请求。

标签: javascript while-loop promise


【解决方案1】:

我在想类似的东西(伪代码):

function makeAsyncCall(data) {
    if (data) {
        // save to db
    }
    $.ajax({
        url: '/url',
        success: function(data) {
           makeAsyncCall(data);
        }
    })
}

然后你需要有一个标志来决定何时停止调用该函数。

【讨论】:

  • 递归函数?我试试,谢谢!
  • 没有承诺,没有错误处理 :-(
  • 你的承诺是对的。没有错误处理,因为我只想展示与问题相关的核心内容。在没有承诺的情况下使用 this 到底有什么问题?
  • JavaScript 没有针对递归的尾部优化,这意味着它可能会破坏堆栈。我会避免在 JavaScript 中使用递归。
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 2016-09-29
  • 2015-11-13
  • 2017-04-21
  • 2015-06-05
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多