首先,请看一下这个演示。
function loadImageAsync(url) {
return new Promise(function(resolve, reject) {
var image = new Image();
image.src = url;
// onload 在对象已加载时触发
image.onload = resolve;
// onerror 在文档或图像加载过程中发生错误时被触发
image.onerror = reject;
})
}
var someImgEle = document.getElementById("imgEle");
var url = someImgEle.dataset.src
loadImageAsync(url).then(function() {
someImgEle.src = url;
someImg.style.display = "block";
// error will be printed
}).catch(function() {
console.log("error")
throw new Error('couldnt load image' + url);
})
/*
loadImageAsync(url).then(function(){
someImgEle.src = url;
someImg.style.display = "block";
// error will be not printed
},function () {
console.log("error")
throw new Error('couldnt load image' + url);
})
*/

<img id="imgEle" src="" data-src="http://omizt4opc.bkt.clouddn.com/avatar.jpg" alt="">
&#13;
在这个演示中,我认为&#34;错误&#34;无法打印。事实伤害了我。
最近,我通过url学习了Promise。
但这个演示似乎与此相矛盾。
我很困惑。
答案 0 :(得分:2)
如果您使用catch
:
.catch(function() {
console.log("error")
throw new Error('couldnt load image' + url);
})
图片加载和 success
回调中发生的错误:
someImgEle.src = url;
someImg.style.display = "block";
someImg.accessUndefinedProperty.oneLevelMore; // TypeError: Cannot read property 'oneLevelMore' of undefined
将被抓住。
如果使用error callback
而不是catch
子句,则只会捕获图像加载期间的错误。一般推荐是使用catch
而不是错误回调。
<强>更新强>
在您的特定情况下,您在此处出现错误:
someImg.style.display = "block";
由于未定义someImg
,因此执行catch
块。您只需在error
块中传递catch
对象即可检查错误:
.catch(function(error) {
^^^^^
此特定案例说明了为什么catch
优先于error callback
。
答案 1 :(得分:1)
.catch(rejection)
是否等于.then(null,rejection)
?
是。而且不仅等于,它甚至以then
的形式实现。
然而:
loadImageAsync(url).then(function(){ // error here will be printed }).catch(function() { console.log("error") }) loadImageAsync(url).then(function(){ // error here will be not printed }, function () { console.log("error") })