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?
\n\n\n对我来说,返回的结构会这样改变似乎很奇怪。
\n
是的,jQuery 在这里非常不一致。当您将单个参数传递给 时$.when,它会尝试将其转换为承诺,当您传递多个参数时,它会突然尝试等待所有参数并合并它们的结果。现在引入 jQuery 承诺可以解析多个值(参数),并为此添加一个特殊情况。
所以我可以推荐两种解决方案:
\n\n完全删除$.when并使用Promise.all它代替:
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})\nRun Code Online (Sandbox Code Playgroud)让每个 Promise 仅使用单个值进行解析($.ajax()与使用 3 进行解析不同),这样它们就不会被包装在数组中,并且$.when无论参数数量如何,都会产生一致的结果:
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})\nRun Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |