Javascript 取消承诺链?
我做出了一系列承诺:Javascript 取消承诺链?,javascript,jquery,Javascript,Jquery,我做出了一系列承诺: this.getData.then(this.getMoreData).then(this.getEvenMoreData); 在某些时候,用户可能会决定取消请求并请求其他内容 如何取消链的传播?您必须检查每个链接方法内的状态(是否应取消): var userRequestedCancel = false; this .getData() .then(function() { if(userRequestedCancel) { retu
this.getData.then(this.getMoreData).then(this.getEvenMoreData);
在某些时候,用户可能会决定取消请求并请求其他内容
如何取消链的传播?您必须检查每个链接方法内的状态(是否应取消):
var userRequestedCancel = false;
this
.getData()
.then(function() {
if(userRequestedCancel) {
return Promise.reject('user cancelled');
}
return getMoreData();
})
.then(function() {
if(userRequestedCancel) {
return Promise.reject('user cancelled');
}
return getEvenMoreData();
})
或者是一种稍微优雅一点的方式(经过编辑以将上下文和参数传递给callback
方法)
如果您还需要取消当前请求(这有点琐碎),请将当前的
ajax
请求设置为一个全局变量,并且无论什么事件将userRequestedCancel
标志设置为true,都可以取消ajax
请求(请参见上面编辑的代码)要取消承诺链,您需要抛出一个错误。只要看看下面的代码
function CancelError() {
this.message = 'Cancelled';
}
obj
.then(function() {
throw new CancelError();
})
.catch(function(err) {
if (err instanceof CancelError) {
// Promise got cancelled
}
throw err; // throw the other mistakes
});
有趣的小挑战
如果不知道您正在启动哪个任务、请求或进程,以及用户如何中断所述进程,则很难推荐任何解决方案来“中断”。然后(…)
链,而不进行一些会触发.catch(…)
拒绝回调的黑客/技巧
话虽如此,看看这个例子是否能说明问题
请特别注意makeInterruptablePromise函数及其使用方法:
var bar=$('.progress bar');
风险值h3=$(“h3”);
变种景观;
功能日志(消息,替换){
h3[替换?'html':'append'](msg+“
”);
}
$(文档).keydown(e=>{
开关(如钥匙代码){
案例27://逃跑
返回isEscape=true;
案例32://空间
返回runDemo();
}
});
函数makeInterruptablePromise(cbStatus){
返回新承诺((解决、拒绝)=>{
函数循环(){
开关(cbStatus()){
案例1:返回resolve();
案例1:返回拒绝();
默认值:requestAnimationFrame(循环);
}
}
//别忘了启动循环!
loop();
})
}
函数runDemo(){
日志(“等待…”(ESC中断,空格重放)”,true;
isEscape=假;
var timeToComplete=2000;
var timeStart=Date.now();
函数updateBar(){
var timeDiff=Date.now()-timeStart;
var timePercent=timeDiff/timeToComplete;
TweenMax.set(bar,{scaleX:1-timePercent});
返回时间百分比>1;
}
makeInterruptablePromise(()=>{
if(isEscape)返回-1;
if(updateBar())返回1;
返回0;
})
.然后(()=>日志(“内部*然后*链”)
.catch(()=>日志(“跳过*然后*链!”)
}
runDemo()//第一次运行。
正文{
背景色:#123456;
颜色:#fff;
}
.进度条{
显示:块;
宽度:200px;
高度:10px;
背景色:#88f;
变换原点:左上角;
}
你说的“用户”是什么意思?这是一段尽可能快地执行的代码,您如何在这里添加用户干预?该站点正在获取大量数据。如果用户随后请求其他数据,我想停止获取当前数据集并输出它。那么结果会如何?这个请求是否有一个state对象可以指示它已被取消,比如var state={running:true}
,然后您可以根据需要测试if(state.running){返回this.getMoreData()}
。如果您通过ajax获取数据,您可以取消请求。如果您使用bluebird Promissions,请查看:。基本上,取消只是我抛出一个自定义对象,然后你就可以捕获它。如果getData()是某个ajax请求,当还没有收到答案时,该请求应该被中止。@NickRussler-从概念上讲,这并不难。请参阅编辑的代码-保留对当前ajax请求的引用,无论何时将userRequestedCancel
设置为true
-也取消上一个请求。是的,刚才提到它是因为op说“站点正在获取大量数据[…]”谢谢-这里的双(&U)是什么意思?currentReq&¤tReq.abort()@panthro-这是一个缩写if-如果左边的语句(即currentReq
)是truth-y,那么评估&
后面的内容-这与说if(currentReq){currentReq.abort();}
一样,我如何从链外抛出错误?如果用户启动了一个新链,我需要取消当前链。
function CancelError() {
this.message = 'Cancelled';
}
obj
.then(function() {
throw new CancelError();
})
.catch(function(err) {
if (err instanceof CancelError) {
// Promise got cancelled
}
throw err; // throw the other mistakes
});