我正在使用 AngularJS 开发一个管理应用程序。应用程序使用 $resource 从服务器获取数据。我最终得到包含“$promise”属性的数据对象来确定何时获取数据。一切安好。

现在,这个管理应用程序还可以创建新对象。这些新对象由与通常来自“$resource”的控制器相同的控制器管理。

所以现在我有两种对象:

  • 具有 $promise 属性的对象。我应该在使用完整数据操作它们之前使用 $promise.then()
  • 普通物体。他们没有 $promise 属性,他们的价值可以立即访问

我想减少代码并拥有单一用例,而不必检查对象数据是否已解析,或者是否不是承诺。

通过添加已经解决的“$promise”属性来构建我的“普通”对象是否有任何问题?这样,我将始终使用“myObject.$promise.then()”。

有没有通用的模式来处理这种情况?我找不到任何“标准”方法来使用 Angular 创建此类对象。

有帮助吗?

解决方案

你可以使用 $q.when 如果不确定该对象是否有承诺。

(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 方)then-able Promise 的对象包装到 $q Promise 中。当您处理的对象可能是也可能不是承诺,或者承诺来自不可信的来源时,这非常有用。

您不需要总是创建 Promise 并将其附加到正在传输的数据上,相反,您可以使您的方法返回 Promise,从而帮助您实现 Promise 模式并抽象出服务本身的 Promise 逻辑。例子:-

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

这是一个简化且不太明确的版本(来源:本杰明·格伦鲍姆):

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

你当然可以 return $q.reject(derivedReason) 这里的想法不是返回原因并根据进一步的检查对其进行转换,而是缓存承诺而不是值。这还有一个优点,如果该方法在返回一次之前被调用,则不会发出多个 http 请求。

现在你总是可以这样做:-

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

    }).catch(function(error){

    });

Promise 也可以被链接起来。所以你也可以这样做:-

   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