Javascript 为什么接球挡跑?

Javascript 为什么接球挡跑?,javascript,ajax,asynchronous,promise,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');

我有下面的函数,它发出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(),它不取决于函数(在本例中是getSegments)吗?

then()
也返回一个承诺,未捕获的异常通过调用链传播,直到找到
catch()
,因此
catch()
针对调用链中捕获的任何异常运行

新承诺((res,rej)=>{
res()
}).然后(()=>{
加入“那么”
}).catch(e=>console.log(e))
then()
也返回一个承诺,未捕获的异常通过调用链传播,直到找到
catch()
,因此
catch()
对调用链中捕获的任何异常运行

新承诺((res,rej)=>{
res()
}).然后(()=>{
加入“那么”

}).catch(e=>console.log(e))
实际上
。然后
接受两个参数,一个是在一切正常时调用的函数,另一个是在前一个链中发生错误时调用的函数。在你的情况下,你可以写:

 getSegments(url).then(
   data => { new Whinweel() },
   error => console.log(error)
 );

现在使用
.catch(handler)
实际上与
相同。然后(null,handler)
,如前所述,如果前一个链中存在错误,则调用错误处理程序,包括前一个“then”处理程序。

实际上
。然后
接受两个参数,一个函数在一切正常时调用,另一个函数在前一个链中发生错误时调用。在你的情况下,你可以写:

 getSegments(url).then(
   data => { new Whinweel() },
   error => console.log(error)
 );

现在使用
.catch(handler)
实际上与
相同。然后(null,handler)
,如前所述,如果前一个链中存在错误,包括前一个“then”处理程序,就会调用错误处理程序。

KITACE,如何阻止它传播到该特定的catch()?我只想在函数拒绝时使用该catch块?@RafayHassan如果要捕获函数中的异常,或者按照Jonases的指令kitace,我如何阻止它传播到特定的catch()?我只想在函数拒绝时使用该catch块?@RafayHassan您要么捕获函数中的异常,要么遵循jonass的命令instructions@JuanMendes你们两个能再详细一点吗?@rafay不,因为Juan没有仔细阅读我的答案:)这就是我删除评论的原因:)但是问题结束了,因为你提到的模式令人困惑,除非你小心,否则可能会错过这个案例。您的示例将错过由
new Whinweel
引起的错误,我知道这是OP想要的,但这似乎是一个糟糕的想法。我的观点是,它们不是等价的。看看这个被否决的答案@juan yes,
。然后(a)。catch(b)
等于
然后(a)。然后(undefined,b)
正如答案所说,它可能被否决,因为它没有抓住重点question@JuanMendes你们两个能再详细一点吗?@rafay不,因为Juan没有仔细阅读我的答案:)这就是我删除评论的原因:)但是问题结束了,因为你提到的模式令人困惑,除非你小心,否则可能会错过这个案例。您的示例将错过由
new Whinweel
引起的错误,我知道这是OP想要的,但这似乎是一个糟糕的想法。我的观点是,它们不是等价的。请看这个被否决的答案@juan yes,
。然后(a)。catch(b)
等于
然后(a)。然后(undefined,b)
正如答案所说,它可能被否决,因为它没有抓住问题的重点