我有以下使用本机承诺的代码:
function getUser() {
return new Promise(function (resolve, reject) {
reject();
});
}
function changeUser() {
return new Promise(function (resolve, reject) {
return getUser().catch(function (responseData, test) {
console.log('boo error'); // this logs `boo error`
throw {};
});
});
}
changeUser().then(function () {
console.log('done');
}).catch(function () {
console.log('error'); // this is not triggered
});
当我运行它时,不执行带catch
的第console.log('error');
块。这是为什么?本机承诺的实现是否与Q
不同?
答案 0 :(得分:3)
因为您永远不会reject
从changeUser
返回的承诺。您只是throw
在getUser
返回的承诺链中new Promise
,该承诺链在该链中,但不会影响changeUser
中构建的return new Promise(function (resolve, reject) {
return getUser().then(resolve, function (responseData, test) {
console.log('boo error'); // this logs `boo error`
reject();
});
});
}}
或者:
function changeUser() {
return getUser().catch(function (responseData, test) {
console.log('boo error'); // this logs `boo error`
throw {};
});
}
或者:
MessageQueue messageQueue = new MessageQueue(".\\private$\\TestQueue");
var noOFMessages = messageQueue.GetAllMessages().LongCount();
答案 1 :(得分:2)
因为您在resolve
函数中嵌套了两个不同的保证链。永远不会在该函数中调用reject
和throw {}
函数,因此return new Promise(function (resolve, reject) {
return getUser().catch(function (responseData, test) {
console.log('boo error'); // this logs `boo error`
throw {};
}).then(resolve, reject);
});
不会冒泡。如果您在Chrome中执行此操作,您还会获得“未来的承诺”#39;控制台中的消息。
通过以下方式修复:
return new Promise
或者完全删除--server.endpoint vpp+tcp://127.0.0.1:8529.
行。