诺言解决有什么问题?

有任何想法吗? 为什么节点说'文件名是未定义的'? 谢谢。 合同,政策和发票功能解决没有数据,只是解决()。

var dc = function(data) {

return new Promise(function(resolve, reject) {

    var filename = 'Test';

    var contract = function() { ... }

    var policy = function() { ... }

    var invoice = function() { ... }

    contract().then(invoice().then(policy().then(function() {
        console.log(filename); // Test
        resolve(filename); // UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): ReferenceError: filename is not defined
    })))
})

}

首先,你不能写:

contract().then(invoice() ... )

(如果invoice()函数返回另一个函数以充当then处理程序, then这将工作)

你必须写:

contract().then(function (value) { invoice() ... })

要么:

contract().then(value => invoice() ... )

或者,也许这是一个函数应该处理其他函数的结果:

contract().then(invoice).then(policy).then(function (result) { ... });

你必须作为参数传递什么then是一个函数,而不是调用一个函数(这可能是在你的榜样承诺)的结果。

我不知道这是你的方法唯一的问题,但它肯定是问题之一。 当然,这可能有效,但可能不是你期望的。

2017更新

如果您使用ES2017 async / await,那么可以在v7.0中使用它,而不是:

contract().then(invoice).then(policy).then((result) => { ... });

您可以使用:

let a = await contract();
let b = await invoice(a);
let c = await policy(b);
// here your `result` is in `c`

甚至是这样:

let result = await policy(await invoice(await contract()));

请注意,您只能在使用async关键字声明的函数中使用它。 这适用于自版本7以来的Node。对于旧版本的Node,您可以使用类似的东西,使用基于生成器的协同程序稍微不同的语法,或者您可以使用Babel来转译您的代码,如果这是您所喜欢的,做。

这是一个相当新的功能,但关于它的Stack Overflow有很多问题。 看到:

  • 尝试/ catch异步/等待块
  • 以阻塞程序语言的方式做异步?
  • 尝试/ catch异步/等待块
  • 使用等待外部异步
  • 在Babel中使用acyns /在节点6中等待
  • 异步方法何时抛出,你如何捕获它们?
  • 在node.js中使用promise来创建和比较两个数组
  • 保持承诺链可读
  • 函数将从javascript post / get返回null

  • 看起来你不关心订单,在这种情况下你可以使用Promise.all。 这对你有用吗? 一旦所有的承诺都得到解决,它就会解决,或者一旦其中任何一个拒绝,它就会拒绝。

    function contract(data) { return new Promise(...) }
    function policy(data) { return new Promise(...) }
    function invoice(data) { return new Promise(...) }
    
    function dc(data) {
      var filename = 'Test';
      return new Promise(function(resolve, reject) {
        Promise.all([contract(data), policy(data), invoice(data)]).then(
          function (values) {
            console.log(filename);
            resolve(filename)
          },
          function (err) {
            reject(err);
          }
        );
      });
    }
    

    如果你关心订单,那么你必须把它们链接起来,就像你试图做的那样。 你的代码通过承诺作为参数then 。 你需要传递函数。

    function contract(data) { return new Promise(...) }
    function policy(data) { return new Promise(...) }
    function invoice(data) { return new Promise(...) }
    
    function dc(data) {
      var filename = 'Test';
      return new Promise(function(resolve, reject) {
        contract(data).then(
          function (contract_res) {
            policy(data).then(
              function (policy_res) {
                invoice(data).then(
                  function (invoice_res) {
                    console.log(filename);
                    resolve(filename);
                  },
                  function (err) { reject(err); } // invoice promise rejected
                );
              },
              function (err) { reject(err); } // policy promise rejected
            );
          },
          function (err) { reject(err); } // contract policy rejected
        );
      });
    }
    

    你可能能够通过catch来简化它,但深层嵌套是一种痛苦。 看看这个帖子关于扁平化Promise链。

    链接地址: http://www.djcxy.com/p/55355.html

    上一篇: What is wrong with promise resolving?

    下一篇: Exporting Node module from promise result