【发布时间】:2016-04-05 21:19:20
【问题描述】:
我需要通过解析基于另一个数组构建的承诺数组来构建对象数组。
假设我有一个letters = ['a', 'b', 'c'] 数组。然后,我将它映射为使用每个字母作为参数进行 Ajax 调用,如下所示:
var result = letters.map(function (letter) {
return $.getJSON('myuri', { param: letter });
};
结果,我得到了一个带有 ajax 承诺的数组。然后我像这样解决它:
Promise.all(result).then(function (response) {
console.log(response);
});
日志正在打印每个 ajax 调用的原始响应。在那之前一切都很好。但我不想要原始响应,我想要自定义对象,所以我尝试使用 Ajax 的成功回调来创建它们,如下所示:
var letters = ['a', 'b', 'c'];
var result = letters.map(function (letter) {
return $.getJSON('myuri', { param: letter })
// Chaining with success callback
.done(function (response) {
return {
'custom_attr': response.x,
'athor_custom_attr': response.y
};
});
});
Promise.all(result).then(function (response) {
console.log(response);
});
问题是成功回调不会干扰数组的创建。实际上,我可以在回调中将返回值更改为 ANYTHING 并没有任何区别,代码仍然返回原始响应的数组。
当我使用 Angular 使用 $http 服务时,它运行良好,但使用 $.getJSON 的 JQuery 不起作用,我不明白为什么会发生这种情况。
提前谢谢大家。
【问题讨论】:
-
在您的
map函数中,您将每个字母映射到jqXHR 对象。一旦您的 Promise 得到解决,我认为您需要再次遍历result数组并将每个 jqXHR 的响应数据映射到您想要的自定义对象。 -
但这就是 Promise.all 应该做的。它异步触发所有的 Promise,并用每个对应的结果构建数组。
-
The Promise.all(iterable) method returns a promise that resolves when all of the promises in the iterable argument have resolved, or rejects with the reason of the first passed promise that rejects.。所以
$.getJSON返回一个承诺。所以result是一个 Promise 数组。Promise.all(result)说“从所有这些承诺中做出承诺”,所以在上面加上.then说“当所有这些承诺都完成后,运行这个成功函数。”在该函数中,您可以创建自定义对象。
标签: javascript jquery angularjs ajax promise