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

Jquery 使用延迟调用循环和链接Ajax调用,jquery,ajax,chaining,promise,deferred,Jquery,Ajax,Chaining,Promise,Deferred,关于这一点,我已经看到了很多问题,但似乎没有什么能为我的情况给出正确的答案。 我也看到过使用.pipe的答案,但我正在寻找一个使用.then的答案 好的。我需要做3个ajax调用,比如说一个允许多个帐户的轮询应用程序。 为了使帐户能够投票,需要执行以下过程 登录 选择选项 提交 注销只需清除cookies,无需发布。 假设我有两个账户: var accts = [{user: "acct1", pswd: "1234"},{user: "acct2", pswd: "4321"}]; 现在我需

关于这一点,我已经看到了很多问题,但似乎没有什么能为我的情况给出正确的答案。 我也看到过使用.pipe的答案,但我正在寻找一个使用.then的答案

好的。我需要做3个ajax调用,比如说一个允许多个帐户的轮询应用程序。 为了使帐户能够投票,需要执行以下过程

登录 选择选项 提交 注销只需清除cookies,无需发布。 假设我有两个账户:

var accts = [{user: "acct1", pswd: "1234"},{user: "acct2", pswd: "4321"}];
现在我需要使用jquery的$遍历这些帐户

我了解到,使用$.Deferred可以很好地完成这项工作,但需要正确的实现

我想要的是

--------loop1--------
login
select
vote
--------loop2--------
login
select
vote
All Done!.
但是当我尝试console.log时会发生什么 全部完成! 登录2 选择2 vote2

这是我的代码:

$.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.');
});

我做错了什么?

啊,这类似于我挣扎了一段时间的过程。我的解决方案是在jQuery上使用.apply。何时处理未知数量的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
    });
});

啊,这跟我挣扎了一段时间的过程很像。我的解决方案是在jQuery上使用.apply。何时处理未知数量的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
    });
});

我会用不同的方法来简化它。首先,编写一个处理一个用户的函数,返回为该用户完成处理的承诺:

function one_user(v){
    return $.post(loginURL, {user: v.username, passwrd: v.password})
    .then(function(data) {
        if (data <= 0) { throw "Login failed."; }
        console.log('Logged In!');
        return $.post(pollURL + 'select.php', {id: 143});
    })
    .then(function(data) {
        if (data === 'selected') {throw 'Already have a selection.';}
        return $.post(pollURL + 'submit.php');
    })
    .then(function(data) {
        if(data > 1) {
            Console.log('Successfully Voted.');
        } else {
           // if possible return to the login?
        }
    })
    .fail(function(e) {console.log("Error: "+e);})
   ;
}
请注意,上面传递给when/then的函数本身就是返回承诺。这是编写基于承诺的代码时的常见模式,它允许您将问题分解为单独的承诺序列,然后将它们串在一起

如果在user_数组中有多个用户,尽管不同的promises框架处理此问题的方法略有不同,但一种简单的方法是使用reduce,因此:


我会用不同的方法来简化它。首先,编写一个处理一个用户的函数,返回为该用户完成处理的承诺:

function one_user(v){
    return $.post(loginURL, {user: v.username, passwrd: v.password})
    .then(function(data) {
        if (data <= 0) { throw "Login failed."; }
        console.log('Logged In!');
        return $.post(pollURL + 'select.php', {id: 143});
    })
    .then(function(data) {
        if (data === 'selected') {throw 'Already have a selection.';}
        return $.post(pollURL + 'submit.php');
    })
    .then(function(data) {
        if(data > 1) {
            Console.log('Successfully Voted.');
        } else {
           // if possible return to the login?
        }
    })
    .fail(function(e) {console.log("Error: "+e);})
   ;
}
请注意,上面传递给when/then的函数本身就是返回承诺。这是编写基于承诺的代码时的常见模式,它允许您将问题分解为单独的承诺序列,然后将它们串在一起

如果在user_数组中有多个用户,尽管不同的promises框架处理此问题的方法略有不同,但一种简单的方法是使用reduce,因此:


@甜菜根甜菜根:固定。在运行中写下了所有这些,但没有意识到我把变量/属性弄混了names@Beetroot-甜菜根:固定。为OP写了所有这些,但我没有意识到我把变量/属性名弄混了
user_array.reduce(
    function(prev,cur){
        prev=prev.then(function(){return one_user(cur);});
    }),
    $.Deferred().resolve()
)
.then(function() {console.log("All done!");})
;