节点递归承诺永不退出

时间:2016-02-29 22:01:23

标签: javascript asynchronous promise

我有以下递归函数,递归调用迭代器

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);
};

1 个答案:

答案 0 :(得分:0)

我的问题似乎与用于数据库插入的knex库有关。如果池永远不会关闭,则该过程永远不会退出。这对我来说似乎很奇怪,但最后调用knex.destroy让进程退出