我有一个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方法的数据。
在我连接它的方式中是否有我遗漏的东西?
答案 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);
…
});