Promise没有在process.exit中运行

时间:2014-12-12 03:46:25

标签: javascript events promise bluebird

这是一个只记录hello world的同步代码示例。

function syncTest() {
  console.log("hello world");
}

syncTest();
syncTest();
process.on('exit', function() {
  syncTest();
});

//hello world
//hello world
//hello world

这是预期的,它会再次运行syncTest()两次,然后再次退出。

我在下面使用相同的代码,但代之以承诺。

function existsAsync(path) {
  return new Promise(function(resolve) {
    fs.exists(path, resolve);
  });
}

function promiseTest(projectDir) {
  var pkg = path.join(projectDir, "package.json");
  existsAsync(pkg).then(function(exists) {
    console.log("hello world");
  }).catch(function(e) {
    console.log(e.message);
  });
}

var projectDir = process.cwd();
promiseTest(projectDir);
promiseTest(projectDir);
process.on('exit', function() {
  promiseTest(projectDir);
});

//hello world
//hello world

此承诺的代码只运行两次,由于某些奇怪的原因,它不会在exit事件内运行。这是承诺的怪癖吗?可能是什么导致了这个?我没有以正确的方式使用承诺吗?

1 个答案:

答案 0 :(得分:2)

引自process's exit event documentation

  

当流程即将退出时发出。 此时无法阻止退出事件循环,并且一旦所有退出侦听器都已完成运行,该进程将退出。因此,必须仅执行同步操作在这个处理程序中这是对模块状态执行检查的好钩子(就像单元测试一样)。回调接受一个参数,即进程退出的代码。

     

收听退出的示例:

process.on('exit', function(code) {
  // do *NOT* do this
  setTimeout(function() {
    console.log('This will not run');
  }, 0);
  console.log('About to exit with code:', code);
});

所以,不要在exit事件处理程序中使用promises,而是使代码同步。