我正在使用一些自己的内置promise示例来了解此功能的工作原理。
以下代码会产生错误
ReferenceError:未定义拒绝
我首先使用节点Promise.js并使用8.11.3版的节点
这是我的代码,产生错误的部分注释为“问题
function testPromise () {
//part 1
function checkCountOnServer () {
return new Promise(function (resolve, reject) {
var available = false
if (available) {
resolve('available')
}
else {
reject('not available')
}
})
}
function checkPayment () {
return new Promise(function (resolve, reject) {
var booleanTest = true
if (booleanTest) {
resolve('payment done')
}
else {
reject('no payment received')
}
})
}
var checkCountOnServerVar = checkCountOnServer()
checkCountOnServerVar.then(function (resolve) {
console.log(resolve)
return resolve(checkPayment())
}, function (reason) {
console.log(reason) //works
reject(reason) // problem
}).then(function (value) { console.log(value) },
function (rejected) {
console.log(rejected) //problem
})
}
testPromise()
我实际上希望消息“不可用”两次。
即使我将拒绝(原因)更改为拒绝(“测试”),我也会遇到相同的错误。
请帮助我。
答案 0 :(得分:3)
checkCountOnServerVar.then(function (resolve) {
then
回调函数以承诺被解析为的任何值(在您的情况下为"payment done"
)调用,这不是一个函数,因此您无法调用它。要从then处理程序内部链接一个Promise,只需将其返回:
checkCountOnServerVar.then(function (status) {
console.log(status);
return checkPayment();
})
另外,您的错误捕获程序根本没有任何意义,
function (reason) {
console.log(reason) //works
reject(reason) // problem
}
未定义reject
,并且您实际上不处理该错误。如果不处理该错误,则附加一个处理程序是没有意义的,否则应return
该链可以继续使用的值,例如:
function(error) {
console.error("Something bad happened", error);
return "An error occured, but we don't mind...";
}
总结:
checkCountOnServer()
.then(serverCount => checkPayment())
.then(payment => console.log(payment))
.catch(error => console.error(error));