使用1个或更多jQuery承诺

Rot*_*ock 5 javascript jquery promise

我正在进行一次或多次REST/ajax调用以验证一些用户信息.其余的电话工作正常,信息又回来了.我面临的问题不在于代码的那部分,它看起来像这样.

function ensureUsers(recipients){
  var promises = [];
  for(var key in recipients){
      var payload = {'property':recipients[key]};
      promises.push( $.ajax({...}));
  }
  return $.when.apply($,promises);    
}

....

ensureUsers(users) // users is an array of 1 or more users
  .done(function(){
     console.log(arguments);
  )}
Run Code Online (Sandbox Code Playgroud)

如果初始数组中有多个用户,那么我的.done代码中的参数结构如下:

[[Object,"success",Object],[Object,"success",Object]...]
Run Code Online (Sandbox Code Playgroud)

然后,我可以迭代每个结果,检查状态,然后继续.

但是,如果初始数组中只有一个用户,则.done获取如下参数:

[Object,"success",Object]
Run Code Online (Sandbox Code Playgroud)

我觉得奇怪的是返回的结构会像那样改变.我找不到关于这个特定问题的任何内容,所以我一起解决了一个问题

var promises = Array.prototype.slice.call(arguments);
if(!Array.isArray(promises[0])){
    promises = [promises];  
}
Run Code Online (Sandbox Code Playgroud)

这真的是我能想到的最好的吗?或者是否有更好的方法来处理来自jQuery中的一个或多个ajax调用的返回promise?

Ber*_*rgi 3

\n

对我来说,返回的结构会这样改变似乎很奇怪。

\n
\n\n

是的,jQuery 在这里非常不一致。当您将单个参数传递给 时$.when,它会尝试将其转换为承诺,当您传递多个参数时,它会突然尝试等待所有参数并合并它们的结果。现在引入 jQuery 承诺可以解析多个值(参数),并为此添加一个特殊情况

\n\n

所以我可以推荐两种解决方案:

\n\n
    \n
  • 完全删除$.when并使用Promise.all它代替:

    \n\n
    var promises = [];\nfor (var p of recipients) {\n    \xe2\x80\xa6\n    promises.push( $.ajax({\xe2\x80\xa6}));\n}\n\nPromise.all(promises)\n.then(function(results) {\n     console.log(results);\n})\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 让每个 Promise 仅使用单个值进行解析($.ajax()与使用 3 进行解析不同),这样它们就不会被包装在数组中,并且$.when无论参数数量如何,都会产生一致的结果:

    \n\n
    var promises = [];\nfor (var p of recipients) {\n    \xe2\x80\xa6\n    promises.push( $.ajax({\xe2\x80\xa6}).then(function(data, textStatus, jqXHR) {\n        return data;\n    }) );\n}\n\n$.when.apply($, promises)\n.then(function() {\n     console.log(arguments);\n})\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n