javascript - 我如何在限制堆栈深度的同时链接许多顺序 promise ?

标签 javascript promise stack-overflow

<分区>

我正在尝试发送网络数据。本质上,我使用的库对消息大小有 16kb 的限制,因此我必须分解较大的消息并将它们分成 block 发送。我的代码的真正简化版本可能如下所示:

function sendInChunks(buffers) {
    send(buffers.shift()).then(sendInChunks.bind(undefined, buffers));
}

使用这样的递归实现,我可以发送的数据量受到代码运行平台的堆栈深度限制。我想知道是否有一种方法可以在不受堆栈深度限制的情况下发送我的数据?

注意:在我现在的实际实现中,我实际上是在调用发送后使用相互递归来做一些检查。这两个函数中还使用了来自更高范围的一些状态,但希望不会有太大变化。

编辑:我正在使用 es6 promise 。

最佳答案

Promises 是异步的,这意味着它实际上不是递归调用;它更像是一个循环。下面是一个简单的示例,它也不是递归的。

function send(buffers){
    buffers.shift();
    if (buffers.length) {
        setTimeout(send.bind(null, buffers), 10);
    }
}

send(buffers);

当我们调用send时,它会移动一个缓冲区,然后可能会注册一个超时,然后返回。因为它返回而不调用自己,所以它不是递归的。

旁注:在 ES6 中,有适当的尾调用优化;这意味着递归限制不会经常成为问题。

关于javascript - 我如何在限制堆栈深度的同时链接许多顺序 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21919072/

相关文章:

java - 如何获取客户端系统使用的日期格式?

javascript - Node 奇怪的用户输入异步行为

javascript - node.js 中的 promise

javascript - 从 Javascript Promise 链返回值

c++ - 100 万数组中的 C/C++ Stackoverflow 错误

android - 在 firebase 上保存数据时应用程序崩溃并出现 'java.lang.StackOverflowError: stack size 8MB' 错误

javascript - Backbone js 帮助我获取 JSON 数组

javascript - 为什么谷歌环聊在最新的 Chrome 中支持共享桌面而没有 Chrome 扩展?

javascript - Jest : Testing a nested promise

clojure - 定点组合器的用法?为什么这里堆栈溢出?