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