1

これについて多くの質問を見てきましたが、私の場合は正しい答えが得られないようです。を使用する回答も.pipe見ましたが、を使用する回答を探しています.then

わかった。3 つの ajax 呼び出しを行う必要があります。たとえば、複数のアカウントを許可するポーリング アプリケーションを考えてみましょう。アカウントが投票できるようにするために必要なプロセスは次のとおりです。

  1. ログインする
  2. オプションを選択
  3. 参加する
  4. ログアウト (Cookie をクリアするだけで、投稿する必要はありません)。

私は2つのアカウントを持っているとしましょう:

var accts = [{user: "acct1", pswd: "1234"},{user: "acct2", pswd: "4321"}];

ここで、jquery を使用してこれらのアカウントをループする必要があります$.each

$.each(accts, function(key,value){

});

using を使用するとこれを完全に実行できることを学びました$.Deferredが、正しい実装が必要です。

私が欲しいのは

--------loop1--------
login
select
vote
--------loop2--------
login
select
vote
All Done!.

しかし、何が起こるかは(何が起こっているのかを調べようとするとconsole.log)すべて完了です!login(2) select(2) 投票(2)

だからここに私のコードがあります:

$.each(data, function(k, v) {
    promise.then(function() {
        return $.post(loginURL, {user: v.username, passwrd: v.password});
    }).then(function(html) {
        if (data > 0) {
            console.log('Logged In!');
            return $.post(pollURL + 'select.php', {id: 143});
        } else {
            console.log('Login Failed.');
            return false;
        }
    }).then(function(data) {
        if (data === 'selected') {
            console.log('Already have a selection.');
            return false;
        } else {
            return $.post(pollURL + 'submit.php');
        }
    }).then(function(data){
         if(data > 1) {
             Console.log('Successfully Voted.');
         } else {
           // if possible return to the login?
         }
    });
});

promise.done(function() {
    console.log('All Done. Logged out.');
});

私は何を間違っていますか?.

4

2 に答える 2

6

ああ、これは私がしばらく苦労したプロセスに似ています。私の解決策は.apply、jQuery で使用し.whenて「不明な」数の ajax 呼び出しを処理し、それらをすべて解決することです。

これは、あなたの状況を考えると正確に必要なものではありませんが、問題に対処する方法についていくつかのアイデアを与えるかもしれません. 私はあなたがやろうとしていることの文脈で私のプロセスを述べようとしました。

var ajaxArgs = [{id: 1, password: "qwerty"}, {id: 2, password: "zxcvb"}];

function doLogin(id, pass) {
  return $.post("ws/path/here", {id: id, pass: pass});
}

var logins = $.when.apply(null, ajaxArgs.map(function(argSet) { 
  return doLogin(argSet.id, argSet.password); 
});

logins.done(function(){
    var logins = [].concat(arguments);
    logins.forEach(function(login) {
       //do Vote
       //do Logout
    });
});
于 2013-05-03T17:08:43.207 に答える