Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 取消承诺链?_Javascript_Jquery - Fatal编程技术网

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