我应该效仿'。$ promise'对象?

时间:2014-07-29 00:36:05

标签: javascript angularjs promise angular-resource

我正在使用AngularJS管理应用。该应用程序使用$ resource从服务器获取其数据。我最终得到的数据对象包含' $ promise'用于确定何时获取数据的属性。 一切都很好。

现在,此管理员应用程序还可以创建新对象。这些新对象由通常来自' $ resource'的控制器管理。

所以现在我有两种物体:

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

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

建立我的平原是否有任何问题?对象通过添加' $ promise'已经解决了自己的财产?这样,我总是会使用' myObject。$ promise.then()'。

是否有任何常见的模式来处理这种情况?我找不到任何标准'用Angular创建这种对象的方法。

2 个答案:

答案 0 :(得分:1)

如果不确定对象是否有承诺,您可以使用$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
}) 

如果结果属性没有承诺,则会以承诺解决。

  

将可能是值的对象或(第三方)包装成$ q承诺。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的来源时,这非常有用。

您不需要始终创建承诺并将其附加到正在传输的数据上,而是可以使您的方法返回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;
   }

这是一个简化且不太明确的版本(图片来源: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; });
    }

你当然可以return $q.reject(derivedReason)而不是返回原因并根据进一步的检查对其进行转换,这个想法是缓存承诺而不是价值。如果在返回一次之前调用该方法,这也具有不发出多个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;
    });

答案 1 :(得分:0)

A + promises应提供静态方法:

Promise.resolve(val);

...产生预先解决的承诺。如果您的承诺库提供此功能,您应该返回其中一个。大。我经常这样做以避免界面重复。