Deferred
の使用を「パターン防止」(例:here)としてよく聞きました。 私は、遅延を使用することが理にかなっているシナリオがあるかどうかを理解しようとしています。私は単一のページのWebアプリケーションのページにrecaptchaを持っています。特定のアクションを実行するには、キャプチャテストをパスする必要があります。キャプチャはいつか終了するので、ユーザーはテストをやり直す必要があるかもしれません。しかし、キャプチャが期限切れになる前にユーザーがこれらのアクションの1つをトリガーする場合もありますので、テストをやり直すべきではありません。ここでいくつかの疑似コードを理解してください。これはDeferredの良いユースケースですか?
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モジュールのインポート構文をサポートし、少なくともIE9以上をサポートするバニラjs遅延実装またはライブラリを見つけるのにも苦労しています。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;
}
@ Roamer-1888ありがとうございます!私が使用したソリューションで質問を更新しました – kuus