1

最近、jQueryで$ .Deferred()を使用して少しテストしていて、質問があります。deferedとpromiseは、1回だけ実行することを目的としたajaxcallに最適ですが、ajaxを使用した投稿を複数回実行可能にする必要がある新しいユーザーを追加するためのフォームも取得しました。これで、deferred / promiseのbinary(ish)状態でクラッシュします。解決または拒否されると、その状態が維持されるためです。だから私の質問は:

-複数回呼び出されるタスクに遅延を使用できますか?-可能であれば、これには据え置きを使用することをお勧めしますか、それとも$ .ajaxの成功/エラーコールバックを使用するだけで古いメソッドに固執する必要がありますか?

ここに、フォームを投稿するために集めたコードがあります。これは1回はうまく機能しますが、複数回は機能しません。

var submittingUser = new $.Deferred();
var savingUser = submittingUser.pipe(function(data) {
    return $.post('ajax.php', data);
});

$("#add_new_user").click(function() {
    var data = $("#add_user_form").serialize();
    submittingUser.resolve(data);
    return false;
});

savingUser.then(function() {
    //Success
}, function() {
    //Failed
});
4

3 に答える 3

2

そのように据え置きを使用することは意味がありません。延期はアクションを表します。イベントエミッタとして使用することはできません。非同期アクションを開始するときに遅延を使用し、そのアクションが成功または失敗したときに何かを実行したいとします。

$.post()promiseを返します(実際にはjqXHRインスタンスを返しますが、promiseインターフェースを実装します)ので、次のことができます$.post(...).fail(handleFailure).done(handleSuccess)。ただし、何かが発生するたびに遅延を使用してコードを実行することはできません。

于 2012-05-29T18:53:28.447 に答える
2

延期されたオブジェクトは、設計によるものであり、延期されたオブジェクトが解決された後でもコールバックを追加して、それらを起動することができます。

あなたのコードから、あなたがただできない理由としてそれは明確ではないようです:

$("#add_user_form").submit( function(e){
    e.preventDefault();
    $.post( "ajax.php", $(this).serialize() ).then( function(){

    }, function() {

    });
});
于 2012-05-29T18:53:52.427 に答える
1

これは古いトピックであり、前の回答は元の投稿者の問題に対する完璧な解決策であることを私は知っていますが、延期されたオブジェクトを複数回解決しようとする同じ一般的な問題に遭遇したので、解決策を共有したいと思いました。

以下は不可能ですが:

var d = $.Deferred();
d.done(function(text){
   alert('resolved ' + text);
});
d.resolve('Once'); // prints resolved once
d.resolve('Twice'); // this does nothing as done is only fired once

代わりに、jQueryDeferredオブジェクトのprogress/ notify関数を使用するだけで、まったく同じ効果を実現できます。ただ行う:

var d = $.Deferred();
d.progress(function(text){
   alert('resolved ' + text);
});
d.notify('Once'); // prints resolved once
d.notify('Twice'); // prints resolved twice

このように、遅延オブジェクトが実際に解決されることはありませんが、必要な数の非同期イベント呼び出しを実行できます。この方法で問題を解決するのは最善のソフトウェア設計ではないかもしれませんが、私は今の状況に役立つことがわかりました。

于 2015-07-03T14:57:08.623 に答える