2017-03-14 1 views
3

Erstens, bitte schauen Sie sich diese Demo an.In Versprechen von es6 ist ".catch (Ablehnung)" gleich ".then (null, Ablehnung)"?

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") 
 
    \t throw new Error('couldnt load image' + url); 
 
}) 
 
*/
<img id="imgEle" src="" data-src="http://omizt4opc.bkt.clouddn.com/avatar.jpg" alt="">

In dieser Demo, denke ich, dass "Fehler" kann nicht gedruckt werden. Die Tatsache tut mir weh.

Kürzlich studiere ich Promise von url.

Aber diese Demo scheint dazu konfliktreich zu sein.

Ich bin verwirrt.

+2

Ich verstehe nicht, warum Sie denken, dass Fehler nicht gedruckt werden kann. – zeroflagL

+0

, um die Frage im Titel zu beantworten (die getrennt von dem Text im Körper der Frage scheint) ... ja, '.catch (onReject)' ist genau gleich '.then (null, onReject)' - aber NICHT das gleiche wie '.then (onFulfill, onReject)' - in der Tat, das Polyfill, das ich benutze, hat dieses Bit Code drin 'Promise.prototype.catch = function (onRejected) { gib das zurück.dann (null, onRejected); }; ' –

Antwort

2

Wenn Sie catch verwenden:

.catch(function() { 
    console.log("error") 
    throw new Error('couldnt load image' + url); 
}) 

sowohl ein Fehler bei der Bild Last auftretenden und innerhalb success Rückruf:

someImgEle.src = url; 
    someImg.style.display = "block"; 
    someImg.accessUndefinedProperty.oneLevelMore; // TypeError: Cannot read property 'oneLevelMore' of undefined 

wird gefangen werden.

Wenn Sie error callback anstelle einer catch-Klausel verwenden, wird nur der Fehler beim Laden des Abbilds abgefangen. Die allgemeine Empfehlung lautet catch anstelle von Fehlerrückrufen zu verwenden.

Update:

In Ihrem speziellen Fall haben Sie einen Fehler hier:

someImg.style.display = "block"; 

seit someImg nicht definiert ist, der catch Block ausgeführt wird. Sie können durch einfaches Durchleiten error Objekt in catch Block einen Fehler überprüfen:

.catch(function(error) { 
       ^^^^^ 

Dieser Fall zeigt, warum catch-error callback bevorzugt.

+0

Nur wenn Fehler auftreten, wird Catch ausgeführt. Ich meine, dass es keine Fehler während des Ladens von Bildern und innerhalb des Erfolgs-Callbacks gibt. Also ich verstehe nicht, dass der Fang ausgeführt wurde. – may

+0

@may, ah, ich verstehe es jetzt. Es wird ausgelöst, weil ** du ** hier einen Fehler hast 'someImg.style.display =" block ";' - siehe meine aktualisierte Frage. Vergiss auch nicht, dass du meine Antwort aufheben oder akzeptieren kannst, wenn es mir hilft. –

+0

oh ................................... Es tut mir leid. Ich habe einen kleinen, aber großen Fehler gemacht. Ich verstehe völlig, was du gesagt hast! Eigentlich weiß ich, Fang ist besser als der Rückruf von damals. Vielen Dank! – may

1

Ist .catch(rejection) gleich .then(null,rejection)?

Ja. Und nicht nur gleich, es ist sogar in Bezug auf then umgesetzt.

jedoch:

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

Das genaue ist. .then(…).catch(…) and .then(…, …) are not equal.

Verwandte Themen