为什么捕获块会运行?

时间:2018-12-27 09:49:51

标签: javascript ajax asynchronous promise

我具有以下功能,该功能发出ajax请求或从API提取数据。

function getSegements(url) {
    return new Promise((resolve, reject) => {
        request = new XMLHttpRequest();
        request.open('GET', url);
        request.setRequestHeader('Content-Type', 'application/json');

        // request.onload = () => resolve(request.response);
        // request.onerror = () => reject(request.status);

        request.onreadystatechange = function() {

            if (request.readyState === 4)
            { 
                if (request.status === 200)
                {
                    data = JSON.parse(request.response);
                    console.log(data.segements);
                    resolve(data); 
                }
                else
                {
                    reject({status: request.status});
                }
            }
        };
        request.send();
    });
}

调用函数:

getSegements(url).then((data) => {
    //console.log(data);
    //data = JSON.parse(data);
    theWheel = new Winwheel({
        'outerRadius'     : 212,
        'textFontSize'    : 16,
        'textOrientation' : 'horizontal',
        'textAlignment'   : 'outer',
        'numSegments'     : data.no,
        'segments'        : data.segements,
        'animation' :           // Specify the animation to use.
        {
            'type'     : 'spinToStop',
            'duration' : 5,     // Duration in seconds.
            'spins'    : 3,     // Default number of complete spins.
            'callbackFinished' : alertPrize
        }
    });
    theWheel.animation.spins = 9;
    wheelSpinning = false;
})
.catch((err)=>{
    console.log(err);
    alert('Request failed.  Returned status of ' + err.status);
});

如果WinWheel的参数有问题,它将运行 catch 块。为什么这样跑?是否要运行 then() catch()取决于函数(在本例中为 getSegements )?

2 个答案:

答案 0 :(得分:2)

then()也会返回Promise,并且未捕获的异常会在整个调用链中传播,直到找到catch(),因此catch()会运行在调用链中捕获的任何异常

new Promise((res, rej) => {
  res()
}).then(() => {
  throw "in then"
}).catch(e => console.log(e))

答案 1 :(得分:1)

实际上atom带有两个参数,一个函数在一切正常时调用,而另一个函数在前一个链发生错误时调用。您可以写:

.then

现在使用 getSegments(url).then( data => { new Whinweel() }, error => console.log(error) ); 实际上与.catch(handler)相同,并且如前所述,如果前一个链中有错误(包括先前的“ then”处理程序)发生错误,则将调用错误处理程序。 / p>