Heim > Fragen und Antworten > Hauptteil
Code:
var der = {};
var p = new Promise(function (resolve, reject) {
der.reject = reject;
})
p.then((v) => {
console.log('resolve');
console.log(v);
})
p.catch(function (v) {
console.log(v);
console.log('reject');
console.log(v);
});
der.reject(p);
console.log(p);
Unter Firefox wird nur „Ablehnen“ ausgegeben, unter Chrome wird jedoch normal eingegeben, und dann wird „Uncaught (in versprochen)“ angezeigt
Entschuldigung, warum tritt eine nicht abgefangene Ausnahme auf? Der Fang von p ist klar definiert und warum weist Firefox nur die Ausgabe zurück, und die Ausgabe von p hat keine Auswirkung (tatsächlich sollte sie durch eine nicht abgefangene Ausnahme verursacht werden)
Ergänzung:
Der Grund für die nicht abgefangene Ausnahme ist, dass die zweite Funktion zwar nicht darin definiert ist, dann aber trotzdem ausgeführt wird und die Ursache und der Status an das zurückgegebene neue Promise-Objekt übergeben werden. Das zurückgegebene Promise-Objekt hat keinen Catch-Callback. es wird also eine Ausnahme gemeldet
Aber der Grund, warum die Ausgabe von p in Firefox keine Auswirkung hat, ist noch unklar
伊谢尔伦2017-06-14 10:55:56
var der = {};
var p = new Promise(function (resolve, reject) {
der.reject = reject;
})
// 下面修改成这个样子,因为then内部的处理函数也需要异常捕获
p.then((v) => {
console.log('resolve');
console.log(v);
}).catch(function (v) {
console.log(v);
console.log('reject');
console.log(v);
});
der.reject(p);
console.log(p);
欧阳克2017-06-14 10:55:56
Promise相当于一个标准,符合标准的这种原型都可以称为promise,在标准之外的特性不同浏览器可能不一样,很显然,火狐认为.catch和.then可以分别声明,然后在运行时响应,也就是你上边提到的没报错;而谷歌则认为.catch要连同.then中的异常一同处理,所以需要作用在.then之后的promise上。你将.then().catch连用,谷歌就不会报错。深层次的原因也有可能一个是基于事件,一个是基于轮询导致的。