2016-02-29 57 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让流程退出