2
我有下面的递归函数调用递归迭代节点递归承诺永远不会退出
的conversions.next()调用的请求,承诺调用的API端点的下一个页面
的转换.done只是检查是否没有更多页面
通过调用api端点作为第一个参数来启动此循环。
问题是,我的节点进程永远不会退出使用这个,我似乎有10 +打开TCP套接字连接时,process._getActiveHandles()运行在代码的末尾,但节点没有进一步的代码来执行,但不退出
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的输出()。长度为类型TCP套接字的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);
};
请向我们展示您的迭代器的实现以及您最初调用的'loadConversions'。它看起来像'做完了'永远是'假'。 – Bergi
我添加了迭代器实现和初始调用。奇怪的是,console.log('done db insertions')运行,尽管之后没有代码,但该进程永远不会退出 – jankyd
有一个很好的机会,它与实际的recrusive诺言部分无关,因为它确实执行后来的代码,我不知道还有什么可以让节点进程保持打开状态。 – jankyd