Jquery 使用延迟调用循环和链接Ajax调用
关于这一点,我已经看到了很多问题,但似乎没有什么能为我的情况给出正确的答案。 我也看到过使用.pipe的答案,但我正在寻找一个使用.then的答案 好的。我需要做3个ajax调用,比如说一个允许多个帐户的轮询应用程序。 为了使帐户能够投票,需要执行以下过程 登录 选择选项 提交 注销只需清除cookies,无需发布。 假设我有两个账户: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"}]; 现在我需
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!");})
;