在es6的承诺中,' .catch(拒绝)'等于'。然后(null,rejection)'?

时间:2017-03-14 09:17:07

标签: javascript ecmascript-6 promise frontend

首先,请看一下这个演示。



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;
&#13;
&#13;

在这个演示中,我认为&#34;错误&#34;无法打印。事实伤害了我。

最近,我通过url学习了Promise。

但这个演示似乎与此相矛盾。

我很困惑。

2 个答案:

答案 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")
})

这是准确的。 .then(…).catch(…) and .then(…, …) are not equal