我有以下递归函数,递归调用迭代器
conversions.next()调用是对api端点的下一页的请求 - 承诺调用
conversions.done只检查是否有更多页面
通过将调用传递给api端点作为第一个参数来启动此循环。
问题是我的节点进程永远不会退出使用它,当代码末尾运行process._getActiveHandles()时,我似乎有10 +打开TCP套接字连接,但是节点没有其他代码可以执行,但不退出
const loadConversions = function loadConversions(httpCallPromise, allConversions) {
allConversions = typeof allConversions !== 'undefined' ? allConversions : [];
return httpCallPromise.then((conversions) => {
allConversions = allConversions.concat(conversions.value);
if (conversions.done === false) {
return loadConversions(conversions.next(), allConversions);
}
return Promise.resolve(allConversions);
});
};
// this is the entry point for the code
if (args[0] === 'conversions') {
loadConversions(queries.conversions())
.then((allConversions) => {
console.log(allConversions.length);
return Promise.all(allConversions.map(db.insertConversion));
})
.then(() => {
console.log('done db insertions');
console.log(process._getActiveHandles().length);
})
.catch((err) => {
console.log(err);
});
}
process.getActiveHandles()的输出.length是tcp socket类型的13个节点进程
这是迭代器
const cakeRequest = function(options) {
// make the request
return rp(options)
.then((response) => {
const processed = processResponse(response);
return {
next: function next() {
const nextOptions = Object.assign({}, options, {
qs: Object.assign({}, options.qs, {
start_at_row: parseInt(options.qs.start_at_row, 10) + parseInt(options.qs.row_limit, 10),
}),
});
return cakeRequest(nextOptions);
},
value: processed.value,
done: processed.done,
row_count: processed.row_count,
};
})
.catch(handleError);
};
答案 0 :(得分:0)
我的问题似乎与用于数据库插入的knex库有关。如果池永远不会关闭,则该过程永远不会退出。这对我来说似乎很奇怪,但最后调用knex.destroy让进程退出