javascript - 构建 Ajax 调用数组时,JQuery Ajax 成功回调不起作用

标签 javascript jquery angularjs ajax promise

我需要通过解析基于另一个数组构建的 promise 数组来构建对象数组。

假设我有一组 letters = ['a', 'b', 'c']。然后,我将其映射为使用每个字母作为参数进行 Ajax 调用,如下所示:

var result = letters.map(function (letter) {
    return $.getJSON('myuri', { param: letter });
};

结果,我得到了一个带有 ajax promise 的数组。然后我这样解决:

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,这没有任何区别,代码仍然返回原始响应的数组。

当我使用 $http 服务对 Angular 执行此操作时,它运行良好,但使用 $.getJSON 对 JQuery 执行此操作时不起作用,我不明白为什么这正在发生。

提前谢谢大家。

最佳答案

您的回调返回值被忽略,因为您已经使用了done。你真正想要的是使用 then它为回调的结果创建了一个新的 promise :

var result = letters.map(function (letter) {
    return $.getJSON('myuri', { param: letter })
        .then(function (response) {
            return {
                'custom_attr': response.x,
                'athor_custom_attr': response.y
            };
        });
});

done 方法不可链接!几乎没有理由在 then 上使用它。

关于javascript - 构建 Ajax 调用数组时,JQuery Ajax 成功回调不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36412248/

相关文章:

javascript - Dropzone.js 与其他表单结合 - html5 需要验证

javascript - AngularJS 中允许有一个复选框

javascript - 输入输入框时文本被删除

javascript - Codeigniter 上的 Sweet Alert js

javascript - ui-bootstrap(Angular.JS)中选项卡的淡入淡出效果

javascript - Jasmine 在 $scope.$on 上给出 TypeError

angularjs - 需要帮助在 angularjs 中使用 visjs 创建网络图

javascript - 不能在 node.js 中使用模板字符串

jquery - Ruby 1.9.1、Rails 2.3.2 和 jrails 0.4 出现 "rescue in const_missing"错误

javascript - 如何让 .each() 等待每次迭代完成