Вопрос

Я работаю над приложением администратора с Angularjs. Приложение извлекает свои данные с сервера с использованием $ Resource. В конечном итоге я в конечном итоге объекты данных, содержащие свойство «$ обещания», чтобы определить, когда данные извлечены. Все хорошо.

Теперь это приложение администратора также может создавать новые объекты. Эти новые объекты управляются теми же контроллерами, чем тот, который обычно происходит от «$ Resource».

Так что теперь у меня есть 2 рода объектов:

    .
  • объекты с собственностью $ обещают. Я должен использовать $ обещание. Затем () перед манипулированием их с полными данными
  • Простые предметы. У них нет имущества на обещание, их значение доступно мгновенно

Я хотел бы уменьшить код и иметь один с использованием случая, не должен проверять, будут ли данные объектов, или если это не обещание.

Есть ли какие-либо проблемы в создании моих «простой» объектов, добавив их имущество «$ обещания», которое уже решено для себя? Таким образом, я всегда буду использовать «MyObject». $ Обещают. Затем () '.

Есть ли общий шаблон для обработки этой ситуации? Я не мог найти ни одного «стандартного» метода для создания такого рода объектов с угловым.

Это было полезно?

Решение

Вы можете использовать $ q. Когда если не уверен Объект имеет обещание или нет.

(obj.$promise ? obj.$promise || $q.when(objResult)).then(function(result){
          //handle success case.
          //Incase of object not having the $promise property result will be object itself
}) 
.

Если результирующее свойство не имеет обещания, это будет разрешаться с обещанием.

обертывает объект, который может быть значением или (3-го вечеринка), затем обещают обещанию $ q. Это полезно, когда вы имеете дело с объектом, который может быть или не может быть обещанием, или если обещание исходит от источника, который нельзя доверять.

Вам не нужно всегда создавать обещание и прикрепить его к передаче данных, которые передаются, вместо этого вы можете сделать ваши методы возвращения, тем самым помогуте вам реализовать шаблон обещания и абстрагировать логику обещания на самом обслуживании. Пример: -

   function getCurrentUserData(userId){
       var defered = $q.defer();
       ... 
       //Check in my cache if this is already there, then get it from cache and resolve it
       defered.resolve(objectFromCache);
      //my else condition
      //It is not in cache so let me make the call.
      $http.get('myurl').then(function(result){
            //Do validation with data and if it doesnot match then reject it
            defered.reject(reason);
             //Else Do something with the data put it into the cache, mapping logic etc..
             defered.resolve(dto);


      }).catch(function(error){
            //do something with error and then reject
            defered.reject(reasonDerived);
      });
      return defered.promise;
   }
.

Вот упрощенная и менее явная версия (кредит: benjamin gruenbaum):

var cached = null;
function getCurrentUserData(userId){
    return cached = cached || $http.get('myurl').then(function(result){
        if(isNotValid(result)) return $q.reject(reason); // alternatively `throw`
        return transformToDto(result);
    }, function(response){
     if(checkforsomethingonstatusandreject)
       return $q.reject('Errored Out')
     //do some actions to notify the error scenarios and return default actions
     return someDefaults; });
    }
.

Вы можете, конечно, конечно, генеракодицетагкод здесь, а не возвращать причину и преобразовать его на основе дальнейших чеков, идея кэширует обещание, а не стоимость. Это также имеет преимущество в том, что не создает несколько запросов HTTP-запроса, если метод вызывается, прежде чем он возвращается один раз.

Теперь вы всегда можете сделать: -

    getCurrentUserData(userid).then(function(user){

    }).catch(function(error){

    });
.

Обещания также могут быть прикованы. Таким образом, вы также можете сделать это: -

   return $resource('myresource').$promise.then(function(result){
          //Do some mapping and return mapped data
         return mappedResult;
    });
.

Другие советы

A + Обещания должны предложить статический метод:

Promise.resolve(val);
.

... что генерирует предварительно разрешенное обещание.Вы должны вернуть один из них, если ваши обещания библиотеки предлагают это.Отлично.Я часто делаю это, чтобы избежать дублирования интерфейса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top