Я пытаюсь написать функцию, возвращающую обещание. Но бывают случаи, когда запрошенная информация доступна сразу. Я хочу обернуть это обещанием, чтобы потребителю не нужно было принимать решение.
function getSomething(id) {
if (Cache[id]) {
var deferred = $q.defer();
deferred.resolve(Cache[id]); // <-- Can I do this?
return deferred.promise;
} else {
return $http.get('/someUrl', {id:id});
}
}
И используйте это так:
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
Проблема в том, что обратный вызов не выполняется для предварительно разрешенного обещания. Это законный поступок? Есть ли лучший способ справиться с этой ситуацией?
return $q.when(Cache[id])
. Во всяком случае, это должно работать и вызывать обратный вызов каждый раз, поскольку вы каждый раз создаете новые обещания.Ответы:
Краткий ответ: Да, вы можете выполнить обещание AngularJS, прежде чем вернуть его, и оно будет вести себя так, как вы ожидаете.
Из Plunkr от JB Nizet, но после рефакторинга для работы в контексте того, что было изначально задано (то есть вызов функции для службы) и фактически на месте.
Внутри сервиса ...
Внутри контроллера ....
Надеюсь, это кому-то поможет. Я не нашел других ответов очень ясными.
источник
Как просто вернуть предварительно обработанное обещание в Angular 1.x
Решенное обещание:
Отклоненное обещание:
источник
{resolved: $q.when, rejected: $q.reject}
Вот как я обычно это делаю, если хочу кэшировать данные в массиве или объекте
DEMO
источник
Вы забыли инициализировать элемент Cache
источник
Cache
обещания вместо предполагаемых объектов, а тип возвращаемого значения для случаев, когда объект находится в кэше, а когда его нет, не будет таким же. Я думаю, это более правильно:$http.get('/someUrl', {id: id}).then(function (response) { Cache[id] = response.data; return Cache[id]; });
Мне нравится использовать фабрику для получения данных с моего ресурса, например.
Затем выставьте мою модель в сервисе вот так
Затем мои контроллеры могут включить его и раскрыть или сделать то, что он считает правильным в его контексте, просто ссылаясь на внедренный Service.
Вроде работает нормально. Но я новичок в angular. * обработка ошибок в основном не учитывается для ясности
источник
getStuff
метод использует отложенный антипаттерн