取消JavaScript中的回调 [英] Cancel a callback in javascript

查看:120
本文介绍了取消JavaScript中的回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有类似的东西:

function MyObject() {
  var self = this;

  this.callback = function() {
    self.finishParams = Array.prototype.slice.call(arguments);
    self.parent.finish();
  }

  this.start = function() {
    this.currentCallback = this.callback
    this.startFunc.apply(this.startFunc, this.startParams.concat(this.currentCallback));
  }
}

this.startFunc是一个类似于function的函数(param1,param2,param3,回调)
我无法控制this.startFunc,除了它将使用某些参数调用回调。

this.startFunc is a function which is something like function(param1, param2, param3, callback) I have no control over this.startFunc except that it will call the callback with some paramaters.

问题

我有一个this.currentCallback,因为我需要能够取消回调。也就是说,我已经调用了this.startFunc,需要阻止回调。

I have a this.currentCallback because I need to be able to cancel the callback. That is, I've already called this.startFunc and need to prevent the callback.

问题是,MyObject可能会发送另一个回调(一次不发送2个),但是如果我在需要的时候不立即取消第一个,那么当我找回它们时,我将不知道哪个是有效的!可能会令人困惑,所以这是一个图表:

The problem is, MyObject might send another callback (never 2 at a time) but if I don't cancel the first one immediately when I need to, I won't know which one is valid when I get them back! Might be confusing so here's a diagram:


  • 发送回叫1关闭

  • 需要取消!在某种程度上取消回调

  • 关闭回调2(仍然说函数具有回调1)

至此,如果我没有取消A,那么当我回叫回调时,我将不知道它是哪一个。如果我不取消A,那么我知道它是B,而不必担心。

By this point, if I didn't cancel A, then when I got the callback back, I wouldn't know which it was. If I DID cancel A, then I know it's B and no one has to worry.

请告诉我您是否不明白:)

Please tell me if you do not understand :)

推荐答案

注释中列出的方案的概念验证:为每个回调创建新的闭合,让回调标识其是否处于活动状态

A proof-of-concept of the scheme laid out in the comments: create a new closure for each callback, let callback identify if it is active or not.

function foreignAPIThatStartsACallback(callback) {
  setTimeout(callback, 1000);
}

var activeCallback;

function wrapCallback(callback) {
  var args = Array.prototype.slice.call(arguments, 1);
  var that = this;
  var wrappedCallback = function() {
    if (wrappedCallback == activeCallback) {
      callback.apply(that, args);
    }
  }
  activeCallback = wrappedCallback;
  return wrappedCallback;
}

function myCallback(what, who) {
  console.log(who + " says " + what);
}

foreignAPIThatStartsACallback(wrapCallback(myCallback, "Hello", "Mario"));
foreignAPIThatStartsACallback(wrapCallback(myCallback, "Goodbye", "Luigi"));
// Mario is cancelled when Luigi gets started

具有多个可能的活动:

function foreignAPIThatStartsACallback(callback) {
  setTimeout(callback, 1000);
}

var activeCallbacks = {};

function wrapCallback(callback) {
  if (!wrapCallback.count) wrapCallback.count = 0;
  wrapCallback.count++;
  var args = Array.prototype.slice.call(arguments, 1);
  var that = this;
  var wrappedCallback = function() {
    if (wrappedCallback.id in activeCallbacks) {
      cancelCallback(wrappedCallback);
      callback.apply(that, args);
    }
  }
  wrappedCallback.id = wrapCallback.count;
  activeCallbacks[wrapCallback.count] = true;
  return wrappedCallback;
}

function cancelCallback(wrappedCallback) {
  delete activeCallbacks[wrappedCallback.id];
}

function myCallback(what, who) {
  console.log(who + " says " + what);
}


var marioCallback = wrapCallback(myCallback, "Hello", "Mario");
foreignAPIThatStartsACallback(marioCallback);
var luigiCallback = wrapCallback(myCallback, "Goodbye", "Luigi");
foreignAPIThatStartsACallback(luigiCallback);
var daisyCallback = wrapCallback(myCallback, "Mama?", "Peach");
foreignAPIThatStartsACallback(daisyCallback);

cancelCallback(luigiCallback);
// Mario and Daisy go off

这篇关于取消JavaScript中的回调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆