Javascript 为什么接球挡跑?
我有下面的函数,它发出ajax请求从API获取数据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');
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)
正如答案所说,它可能被否决,因为它没有抓住问题的重点