对JQuery承诺感到困惑

时间:2015-04-28 10:10:55

标签: jquery promise jquery-deferred

我真的很努力地理解行为或JQuery的承诺()。

我想做3个(不相关但背靠背)的AJAX查询:

1. GET the user data
2. POST an image
3. POST another image

然后,我正在做大量基于所述查询结果的事情。

现在,$ .when(ajax,ajax,ajax).then(userData,img1,img2)函数现在效果很好,但是如果我想要我的ajax调用怎么办?被条件缠绕,如下:

$.when(
 if(...){
   $.ajax({ ...GET user data... });
 }
 if(...){
   $.ajax({ ...POST image... });
 }
 if(...){
   $.ajax({ ...POST image... });
 }
).then(function(userData, img1, img2){
 if(img1){
  ...do something with img1...
 }
 ...same for other responses...
});

我知道我的代码并不包含任何承诺,但实际上,我所尝试的所有内容在这种情况下都失败了。

任何暗示/小贴士都表示赞赏。感谢。

2 个答案:

答案 0 :(得分:3)

你可以将非承诺传递给jQuery' $.when它会很好地处理它们:

$.when(15, undefined, $.ajax(...)).then(function(fifteen, undef, result){
    // this will run when the result is ready
});

如果你想根据调用的结果做一些事情你可以通过.then链接它们,如果你想一个接一个地运行它们,你可以使用可用的链接而不是同时工作的$.when

答案 1 :(得分:1)

我认为您正在寻找三元运算符,以及构建默认值承诺的方法:

$.when(
  … ? $.ajax({/* GET user data */}) : $.when(null),
  … ? $.ajax({/* POST first image */}) : $.when(null),
  … ? $.ajax({/* POST second image */}) : $.when(null)
).then(function(userData, img1, img2){
  if (userData)
    … // do something with userData
  if (img1)
    … // do something with img1
  …
});

这将基于相应的条件,发送ajax请求并获得其结果的承诺,或者为值null构建已经履行的承诺。然后等待所有这三个承诺。