有什么想法吗?为什么节点说'文件名未定义'?谢谢。 合同,政策和发票功能解决没有数据,只需解决()。
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
})))
})
}
答案 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
是一个函数,而不是调用函数的结果(在你的例子中可能是一个承诺)。
我不知道这是否是您的方法的唯一问题,但肯定是问题之一。当然它可能有用但可能不是你期望的。
如果你使用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。