从jQuery Deffered函数

时间:2015-08-04 23:19:29

标签: 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方法的数据。

在我连接它的方式中是否有我遗漏的东西?

1 个答案:

答案 0 :(得分:1)

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

jQuery没有在.resolve中解开承诺。在这里,result是一个承诺(您从getCars()返回的承诺),因此userCars将成为承诺的承诺。这就是为什么carsForUser将成为您result回调中的then承诺的原因。

这种推迟在这里是完全超级的。只是做

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);
    …
});