簡體   English   中英

從jQuery Deffered函數獲取數據

[英]Getting data from jQuery Deffered function

我有一個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展開承諾。 在這里, result是一個承諾(您從getCars()返回的getCars() ),因此userCars將成為一個承諾的承諾。 這就是為什么carsForUser將成為您then回調中的result承諾。

在這里,這種延遲是完全多余的。 做就是了

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

這樣您的代碼就會起作用。


除此之外,您的getCars函數還使用了延遲的反模式 您應該將其簡化為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM