承诺解决有什么问题?

时间:2016-12-22 13:17:06

标签: arrays node.js

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

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

}

2 个答案:

答案 0 :(得分:2)

首先,你不能写:

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

(如果invoice()函数返回另一个函数作为then处理程序,那将会有效)

你必须写:

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

或者:

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

或许这可能是一个函数应该处理其他函数的结果:

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

你必须作为参数传递给then是一个函数,而不是调用函数的结果(在你的例子中可能是一个承诺)。

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

2017年更新

如果你使用ES2017 async /等待自v7.0起在Node中可用,那么代替:

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上有很多关于它的问题。参见:

答案 1 :(得分:0)

看起来您不关心订单,在这种情况下您可以使用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);
      }
    );
  });
}

如果您关心订单,那么您必须将它们链接起来,就像您尝试过的那样。你的代码是将 promises 作为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来简化此操作,但深度嵌套很痛苦。请看一下这篇关于flattening Promise chains

的帖子