javascript - 从 jQuery Deferred 函数获取数据

标签 javascript jquery promise

我有一个 JavaScript 函数,可以调用并获取该区域的用户汽车 - 如下所示:

function getCars(userId) {
    var cars = $.Deferred();
    var listOfCars = [];

    // Iterate over all areas
    $.when.apply($, $.map(areas, function (area) {
        return $.when(getCarsForArea(area, userId)).then(function (result) {
            $.merge(list, result);
        });
    })).done(function () {
        cars.resolve(list);
    });

    return cars.promise();
}

然后我有另一个延迟,我想使用传递上面函数的结果。

很像

var userCars = $.Deferred();

var result = getCars('1234');  //User 12345 
userCars .resolve(result);

后来我在一个函数中

$.when(userCars).then(function (carsForUser) {
    console.log(carsForUser);
// rest of method removed for brevity

但是,在我的控制台中,我记录的是 jQuery Promise 对象,而不是 BMW、Mercedes 等 - 即来自 getCars 方法的数据。

我的接线方式是否遗漏了什么?

最佳答案

var userCars = $.Deferred();
var result = getCars('1234');  //User 12345 
userCars .resolve(result);

jQuery 不会在 .resolve 中解开 promise 。这里,result是一个promise(从getCars()返回的那个),因此userCars将成为promise的promise。这就是为什么 carsForUser 将成为 then 回调中的 result promise 。

这里的延迟是完全多余的。就这么做

var userCars = getCars('1234'); // User 12345

这样你的代码就可以工作了。

<小时/>

除此之外,您的 getCars 函数正在使用 deferred antipattern 。您应该将其简化为

function getCars(userId) {
    // Iterate over all areas
    return $.when.apply($, $.map(areas, function (area) {
        return getCarsForArea(area, userId);
    })).then(Array.prototype.concat.bind([]));
    /* if you're less adventurous, use
    .then(function() {
        var listOfCars = [];
        for (var i=0; i<arguments.length; i++)
            $.merge(listOfCars, arguments[i]);
        return listOfCars;
    }); */
}
getCars('1234').then(function (carsForUser) {
    console.log(carsForUser);
    …
});

关于javascript - 从 jQuery Deferred 函数获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31820958/

相关文章:

javascript - 使用 Promise 调用分页 API

javascript - 使用 Promise 并行运行两个 javascript 函数

javascript - 实习生:在 Promise.<Array.<leadfoot/Element>> 上循环

javascript - 按最常见的项目在 javascript 中排序数组

javascript - 如何获取 Jquery bootgrid 中所有选中复选框的所有 ID?

javascript - 如何更改以下 css 按钮的行为?

Javascript - 从另一个数组列表中减去数组列表

jquery - 验证不适用于动态添加的行

javascript - d3js 气泡图中的气泡突出显示功能

javascript - ES6 WeakMap 的实际用途是什么?