将很多(> 40,000)原生承诺链接在一起会占用太多内存

uci*_*ass 0 javascript node.js promise

我有一个项目,我需要编写一个函数来顺序计算几个东西,然后将结果写入SQL DB.不幸的是,我需要重复这个超过40,000次.我使用node.js并承诺完成此任务,但是在10,000次左右的计算之后程序刚刚死亡的内存使用量几乎达到2GB.我开发了自己的本机promiseEach函数,该函数以数量方式获取数组项并使用promises链接它.

我在这里做错了什么?:

function promiseEach(array,promiseFn){
    return new Promise(function(resolve,reject){
        try {
            var promiseArray = [];
            var json = { array: array, counter: 0 }
            for (var i = 0; i < array.length; i++) { 
                promiseArray.push(promiseFn) 
            }
            promiseArray.reduce(function(preFn,curFn,index,pArray){
                return  preFn
                .then( function(z){ return json.array[json.counter++] })
                .then(curFn)
            }, 
            Promise.resolve(json.array[json.counter]))
            .then(resolve,reject)

        }catch(err){
            console.log("promiseEach ERROR:");
            reject(err)
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*a X 6

好吧,你开始过度复杂的功能 - 从我所知道的,你按顺序为每个数组内容调用promiseFn

以下代码在功能上与您的代码相同

function promiseEach(array, promiseFn) {
    return array.reduce(function(prev, item) {
        return prev.then(function() {
            return promiseFn(item);
        });
    }, Promise.resolve());
}
Run Code Online (Sandbox Code Playgroud)

不能保证这会解决实际问题

为了完整性,正如您在nodejs中编码一样,与ES2015 +中编写的代码相同

let promiseEach = (array, promiseFn) => 
    array.reduce((prev, item) => 
        prev.then(() => 
            promiseFn(item)
        )
    , Promise.resolve());
Run Code Online (Sandbox Code Playgroud)