javascript - 通过用户输入停止 jquery .then 链

标签 javascript jquery promise jquery-deferred cancellation

这可能是一个简单的问题,但我完全迷失了。

我有这个功能。

m.util.genericSwipeVertFunc = function (
        ajaxRequest,
        swipeOutTarget,
        swipeInTarget
) {
    var stage1, stage2, failStage, dfd = $.Deferred(), finalStage, functionPromise;

    // Swipe of screen wait for ajax request
    stage1 = function () {
        return $.when(
            ajaxRequest, // Returns $.Deferred()
            m.util.animateDeffered(swipeOutTarget, "fadeOutDown", true) // Returns $.Deferred()
        );
    };

    // Swipe and Show
    stage2 = function () {
        swipeInTarget.show();

        return m.util.animateDeffered(swipeInTarget, "fadeInDown"); // Returns $.Deferred()
    };

    finalStage = function () {
        dfd.resolve();
    }

    failStage = function () {
        console.log("fail!");
        swipeInTarget.hide();
    };

    functionPromise = stage1()
        .then(stage2)
        .then(finalStage);

    $.when(functionPromise,dfd)
        .fail(failStage);

    return dfd;
};

基本上它会执行一些奇特的动画来淡入和淡出ajax函数的不同响应输出。这一切都工作得很好,除了当用户试图非常快地在目标之间进行更改时(在一个链完成之前,它们启动另一个链)我到处都得到疯狂的动画。

我希望能够通过执行类似的操作来随时拒绝该链。

// called on script load.
var currentAction = $.Deferred();

// Called everytime someone starts animation chain.
currentAction.reject();
currentAction = m.util.genericSwipeVertFunc(dfd, swipeOutTarget, swipeInTarget);
            );

使用我当前的代码,failFunction 被正确命中,但它不会停止 stage2 的执行。所以它会隐藏然后显示并继续破坏事物。

所以这个问题。如何将延迟放入链中,以便在链执行期间随时拒绝? :)


fiddle 示例 http://jsfiddle.net/ff3jojbo/


更新澄清

我的动画使用 animate.css。不是 jquery 动画。 我更感兴趣的是如何根据用户输入阻止链在任何时候开始下一阶段。


回答 fiddle http://jsfiddle.net/aefkwa8a/

最佳答案

尝试使用 .queue().promise()

// array of functions to add to queue
var arr = [];

var swipeInTarget = $("#stage1");

var swipeOutTarget = $("#stage2");

// pseudo `ajax` call
var ajaxRequest = function ajaxRequest(next) {
  return $.Deferred(function(d) {
    setTimeout(function() {
      d.resolve("ajaxRequest")
    }, Math.random() * 5000)
  }).promise()
  // Note `.then(function() {console.log(this)})` for example , 
  // can be removed
  .then(function(data) {
    console.log(data)
  }).then(next)
}

var stage1 = function stage1(next) {
  return swipeOutTarget.fadeTo(Math.random() * 5000, Math.random())
        .promise()
        // Note `.then(function() {console.log(this)})` for example , 
        // can be removed
        .then(function() {
          console.log(this)
        })
        .then(next)
}

var stage2 = function stage2(next) {
  return swipeInTarget
    .show(Math.random() * 5000, function() {
      return $(this).fadeTo(Math.random() * 2000, Math.random())
    })
    .promise()
     // Note `.then(function() {console.log(this)})` for example , 
     // can be removed
    .then(function() {
      console.log(this)
    })
    .then(next)
}
// do stuff when queue cleared
var failStage = function failStage() {
  return swipeInTarget.hide(Math.random() * 2000)
    .promise().then(function() {
      console.log("m processes stopped")
    })
}
// always do stuff when queue cleared,
// or all functions in queue complete
var finalStage = function finalStage() {
  console.log("complete", this)
}
// create jQuery object
var m = $({
  m: arr
});
// add function to `"stages"` queue
m.queue("stages", [stage1, stage2, finalStage]);
// do stuff when all functions complete , or queue cleared
m.promise("stages")
.then(finalStage);
// dequque `"stages"` queue
m.dequeue("stages");
// clear `"stages"` queue
$("button").click(function() {
  m.queue("stages", [])
  .promise("stages").always(failStage)
})
#stage2 {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<button>stop m processes</button>
<div id="stage1">stage1</div>
<div id="stage2">stage2</div>

关于javascript - 通过用户输入停止 jquery .then 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33339461/

相关文章:

javascript - 如何关闭div

javascript - 类型错误 : Cannot read property 'then' of undefined

javascript - 如何从递归请求返回 promise 并在数据匹配条件时解决它?

javascript - 声明一个等待 promise 的函数

javascript - 带有 html 输入控件的动态生成的表行在回发时消失

javascript - 将变量传递给原型(prototype)或引用函数内的属性是更好的做法吗?

javascript - 如何在 html 中打印 jquery 值

javascript - 如果在 asp.net 中隐藏了另一个按钮,则单击按钮时显示弹出窗口

javascript - Session::forget() 返回错误意外的 token

asp.net - WCF + Json = 错误的序列化