如何在限制堆栈深度的同时链接许多顺序承诺?

时间:2014-02-20 20:40:26

标签: javascript promise stack-overflow

我正在尝试发送网络数据。从本质上讲,我使用的库对邮件大小有16kb的限制,所以我必须分解更大的邮件并以块的形式发送它们。我的代码的真正简化版本可能如下所示:

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

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

注意:在我现在的实际实现中,我实际上在调用send之后使用相互递归来进行一些检查。在这两个函数中也使用了更高范围的某些状态,但希望它不会发生太大变化。

编辑:我正在使用es6 promises。

2 个答案:

答案 0 :(得分:3)

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

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

send(buffers);

当我们调用send时,它会移动缓冲区,然后可能会注册超时,然后返回。因为它在不调用的情况下返回,所以它不是递归的。

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

答案 1 :(得分:1)

  

我可以发送的数据量受到运行代码的任何平台的堆栈深度限制的限制

没有。由于Promise是异步解析的,因此每个回调都会使用一个新的堆栈帧,并且不会遇到堆栈溢出。