诺言解决有什么问题?
有任何想法吗? 为什么节点说'文件名是未定义的'? 谢谢。 合同,政策和发票功能解决没有数据,只是解决()。
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有很多问题。 看到:
看起来你不关心订单,在这种情况下你可以使用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链。