使用延迟循环和链接Ajax调用

Joe*_*ito 1 ajax jquery chaining promise deferred

我已经看到很多关于这个的问题,但似乎没有什么能为我的案子提供正确的答案.我也看到了使用的答案,.pipe但我正在寻找一个使用的答案.then.

好的.我需要做3个ajax调用,让我们说一个允许多个帐户的民意调查应用程序.需要执行以便帐户可以投票的过程如下.

  1. 登录
  2. 选择选项/ s
  3. 提交
  4. 注销(只需清除cookie,无需发布).

假设我有两个帐户:

var accts = [{user: "acct1", pswd: "1234"},{user: "acct2", pswd: "4321"}];
Run Code Online (Sandbox Code Playgroud)

现在我需要使用jquery来遍历这些帐户 $.each

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

});
Run Code Online (Sandbox Code Playgroud)

我了解到使用$.Deferred可以完美地做到这一点,但是正确的实现.

我想要的是

--------loop1--------
login
select
vote
--------loop2--------
login
select
vote
All Done!.
Run Code Online (Sandbox Code Playgroud)

但是会发生什么(当我尝试console.log发生的事情时)全部完成!登录(2)选择(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.');
});
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?.

BLS*_*lly 6

嗯,这类似于我挣扎了一段时间的过程.我的解决方案是使用.applyjQuery .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
    });
});
Run Code Online (Sandbox Code Playgroud)