这是一个延期的好用例吗?

时间:2016-12-03 18:20:22

标签: javascript recaptcha es6-promise deferred

我经常听说过使用Deferred作为'反模式'(例如here)。 我试图了解我是否有使用延期的情况有意义,也许你可以提供帮助。我在单页Web应用程序的页面上有一个recaptcha。要执行某些操作,需要传递验证码测试。由于验证码在某个时间后到期,用户可能需要重做测试。但有时用户可能会在验证码过期之前触发其中一个操作,因此不应重做测试。下面是一些伪代码,以便更好地理解:

class App {
  constructor () {
    this.captchaPromise = new Deferred();
  }

  maybeDoIt () {
    this.captchaPromise.then(() => {
       this._doIt();
    })
  }

  _doIt () {
    alert('done');
  }

  _onCaptchaSuccess () {
    this.captchaPromise.resolve();
  }

  _onCaptchaExpire () {
    this.captchaPromise.reject();
    this.captchaPromise = new Deferred();
  }
}

const app = new App();

window._captchaOnload = function () {
  window.grecaptcha.render('js-captcha', {
    'sitekey': 'dsadaablsabllbalblablalblablablalbalbalblablabla31',
    'callback': app._onCaptchaSuccess.bind(app),
    'expired-callback': app._onCaptchaExpire.bind(app)
  });
};

您认为这是实施上述方案的好方法吗?

我也很努力找到一个支持es6模块导入语法的vanilla js延迟实现或库,并且至少支持IE9及以上,甚至IE8也会很棒(我不能使用jQuery)。非常感谢任何帮助。

更新

谢谢你的回答,最后我觉得我根本不需要承诺。为了宣传recaptcha渲染是个好主意。我解决了以下问题:

  _doIt (data) {
    if (!this._captchaSolved) {
      this._dataToUseAfterCaptchaSuccess = data;
      return;
    }
    this._dataToUseAfterCaptchaSuccess = null;

    console.log('done', data);
  }

  _onCaptchaSuccess (captchaResponse) {
    this._captchaSolved = true;
    this._captchaResponse = captchaResponse;

    if (this._dataToUseAfterCaptchaSuccess) {
      this._doIt(this._dataToUseAfterCaptchaSuccess);
    }
  }

  _onCaptchaExpire () {
    this._captchaSolved = false;
  }

0 个答案:

没有答案