我经常听说过使用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;
}