Я реорганизовал мой код, чтобы получить более чистый код без дублирования. Но мне интересно, является ли использование $q.all
лучшим вариантом в моем сценарии ...
Кодовая логика:
- У меня есть "необязательное" обещание. В 1 сценарии мне нужно вызвать внешний API (= обещание), в другом сценарии мне не нужен этот внешний вызов (= без обещания).
- Итак, я создал переменную, в которой я могу хранить обещание (или
null
для сценария без обещания).
$q.all
ожидает обещание и затем проверяет, является ли возвращаемое значение чем-то, возвращаемым обещанием (сценарий 1) или null
(сценарий 2).
Функция перед рефакторингом
model.updateWish = function(wish) {
var defer = $q.defer();
if (wish.image) {
// Rename temporary image.public_id to wish_id
cloudinaryService.renameImage(wish.image.public_id, wish._id,
function (image) {
// Update wish with renamed image
wish.image = image;
$http.put(URLS.WISH + "/" + wish._id, wish).success(function (wish) {
updateWishlist(wish);
defer.resolve(wish);
console.info("wish updated", wish);
});
});
} else {
$http.put(URLS.WISH + "/" + wish._id, wish).success(function (wish) {
updateWishlist(wish);
defer.resolve(wish);
console.info("wish updated", wish);
});
}
return defer.promise;
}
Код после рефакторинга
model.updateWish = function(wish) {
var defer = $q.defer();
var renamedImagePromise = null;
if (wish.image) {
// Rename temporary image.public_id to wish_id
renamedImagePromise = cloudinaryService.renameImage(wish.image.public_id, wish._id)
.then( function (image) {
// Update wish with renamed image
wish.image = image;
return wish;
});
}
// Wait until renameImagePromise is resolved and send updated wish to server
$q.all([renamedImagePromise]).then(function(wishWithRenamedImage){
if (wishWithRenamedImage[0]) { // $q.all returns an array, wish is in "wishWithRenamedImage[0]"
wish = wishWithRenamedImage[0];
}
$http.put(URLS.WISH + "/" + wish._id, wish).success(function (wish) {
updateWishlist(wish);
defer.resolve(wish);
console.info("wish updated", wish);
});
})
return defer.promise;
}
Обе функции работают, но мне интересно, является ли это наилучшей реализацией для моих требований ...