2016-04-11 18 views
0

解決済みまたは拒否済みの約束として返されるコードを取得しました。ユーザー入力に基づいてJQuery約束を解決する方法

var runChecks = function(hasClickId, maxClicksModeIsNotOff) { 
    var dfd = $.Deferred(); 

    clickIdCheckPassed = hasClickId; // equals false 
    maxClicksCheckPassed = maxClicksModeIsNotOff; // equals false 

    if (!clickIdCheckPassed) { 
     clickIdCheckPassed = runClickIdCheck(); 
    } 

    if (!maxClicksCheckPassed) { 
     maxClicksCheckPassed = runMaxClicksCheck(); 
    } 

    if (maxClicksCheckPassed && clickIdCheckPassed) { 
     dfd.resolve('Resolved'); 
    } else { 
     dfd.reject('rejected'); 
    } 

    return dfd.promise(); 
}; 

機能runClickIdCheck()runMaxClicksCheck()ユーザーの入力を収集し、それに基づいて、trueまたはfalseのいずれかを返します。

if (maxClicksCheckPassed && clickIdCheckPassed) { 
    dfd.resolve('Resolved'); 
} else { 
    dfd.reject('Rejected'); 
} 

しかし、問題は、コードがユーザーの入力を待たないということであり、各時間が評価されますので、条件 - 両方の結果の値がtrueをしている場合、私はそれ以外の場合は拒否しなければならない、約束を解決する必要がありますユーザが何らかの入力をした後でさえ、「却下された」と約束する。以下のようrunClickIdCheck機能がどのように見えるか参考のため

が、これは次のとおりです。期待どおりに動作し、私はこのコードを作ることができますどのように

var runClickIdCheck = function() { 
    bootbox.confirm('Are you sure?', function(result) { 
     if (result) { 
      return true; 
     } 
    }); 
    return false; 
}; 

私は「解決」への約束を評価するように、場合にのみ、ユーザの入力に依存する機能どちらも真実を返しますか?

編集:

期待されるUIの動作は、ユーザが二回の対話を確認した場合にのみ、フォームが提出されなければならないということである。

$form.submit(function(e) { 
    e.preventDefault(); 
    $.when(runChecks(hasClickId, maxClicksModeIsNotOff)).then(
     function(status) { 
      $form.submit() 
     }, 
     function(status) { 
      return false; 
     } 
    ); 
} 

私は約束のintefaceをを行うだろうと思った理由ですジョブ。 runClickIdCheck()runMaxClicksCheck()trueと評価された場合、約束は解決されます。

+0

私はあなたが約束を誤っていると思います。あなたの小切手は完全に同期しているように見えるので、(たとえ可能であっても)それを約束のセマンティクスに振り分けるのに本当に必要*ではありません。あなたがそれを実行する必要があるときにだけ、チェックを実行してください。解決しようとする問題、つまり実装しようとしているUIの動作について詳しく説明します。また、それを示すために必要なマークアップを追加します。 – Tomalak

+0

@Tomalak 'runClickIdCheck'メソッドが非同期であるように見えます。 OPは適切なコールバックのロジックを設定する必要があります。このプラグインメソッドは(私には分かりませんが)約束インタフェース –

+0

@ A.Wolffを処理します。 – Tomalak

答えて

1

でこれを行うにはが可能ですが、それはそれが価値があるとは思わないです。

私は次のコードを書く前に約束ベースのソリューションを実装しており、bootboxが提供するコールバックベースのアプローチを使用するよりはるかに長く、はるかに明確ではないことが判明しました。

簡単にしてください。

$("#form").submit(function (e) { 
    var self = this; 

    e.preventDefault(); 

    bootbox.confirm('Question 1', function (confirmed1) { 
     if (!confirmed1) return; 

     bootbox.confirm('Question 2', function (confirmed2) { 
      if (!confirmed2) return; 

      $.post(self.action, $(self).serialize()).done(function (data) { 
       // Ajax post has finished successfully 
      }); 
     }); 
    }); 
}); 
関連する問題