NodeJS - 为什么Promise中的当前域未定义?

时间:2016-08-13 19:07:06

标签: node.js promise try-catch

我创建域并运行它。现在输入域时process.domain指向当前活动域。但后来我运行Promise并得到一些奇怪的东西。

'use strict';

var domainCreate = require('domain').create;

var domain = domainCreate();
domain.requestId = 1;
domain.run(function() {
    console.log(process.domain === domain); // true
    console.log(process.domain.requestId); // 1
    Promise.resolve().then(function() {
        console.log(process.domain === domain); // false!!!
        console.log(process.domain.requestId); // throw new TypeError('Cannot read property 'requestId' of undefined')
    }).catch(function(err) {
        console.error(err.stack);
    });
});

为什么process.domain在Promise链中未定义?

2 个答案:

答案 0 :(得分:6)

原生承诺和域名不混合。有一个问题here,其中提到了here):

  

我现在没有深入研究V8的本机承诺已经实施,但如果有必要修补它们以便与域一起工作,那就不会让我感到惊讶。

该线程中的最新评论(here)表明这仍然是Node v6的问题(它是)。

对该问题的评论之一表明,使用像bluebird这样的第三方承诺实现可能会更好(您的示例代码可以使用它),但考虑到域名被认为是一个hack(因此有been deprecated),我认为您应该考虑重新实现代码而不使用域。

答案 1 :(得分:0)

根据Node.js文档模块"域"不推荐使用稳定级别0.更好地以另一种方式处理错误 https://nodejs.org/api/domain.html