2016-02-29 54 views
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); 
}; 
+1

請向我們展示您的迭代器的實現以及您最初調用的'loadConversions'。它看起來像'做完了'永遠是'假'。 – Bergi

+0

我添加了迭代器實現和初始調用。奇怪的是,console.log('done db insertions')運行,儘管之後沒有代碼,但該進程永遠不會退出 – jankyd

+0

有一個很好的機會,它與實際的recrusive諾言部分無關,因爲它確實執行後來的代碼,我不知道還有什麼可以讓節點進程保持打開狀態。 – jankyd

回答

0

我的問題似乎與用於數據庫插入的knex庫有關。如果池永遠不會關閉,則該進程永遠不會退出。這對我來說似乎很奇怪,但最後調用knex.destroy讓流程退出