我如何将诺言解析为视图中的对象?

时间:2018-07-12 01:02:14

标签: angularjs angular-promise ngresource

我正在尝试包装第三方库,以返回一个解析为对象的对象,该对象可以在视图中显示,类似于$ resource()的工作方式。我知道我可以在promise上手动执行.then()然后设置值,但是我希望结果能够无缝返回,类似于我可以做到的:

this.Value = $resource("/someresource").get();

如何更改下面的SomeThirdPartyFunction()以返回在视图中解析的对象。

这是我要做的事的一个例子:

angular.module('testApp', []).controller('TestController', function ($timeout, $q) {
    var TestController = this;
    var SomeThirdPartyFunction = function () {
        var Deferred = $q.defer();
        var Promise = Deferred.promise;

        $timeout(function () {
            Deferred.resolve("abcd");
        }, 3000);

        return Promise;
    };

    TestController.Value = SomeThirdPartyFunction();

    /* I don't want to do this:
    SomeThirdPartyFunction().then(function(Value) {
      TestController.Value = Value;
    });*/
});

这是一个小矮人:https://plnkr.co/edit/HypQMkaqXmFZkvYZXFXf?p=preview

我见过的每个使用promise的示例都只包装了$ http调用,但是我还没有见过任何调用第三方库返回可分解为对象的promise的示例。

2 个答案:

答案 0 :(得分:1)

来自AngularJS document

  

认识到调用$ resource对象方法很重要   立即返回空引用(对象或数组取决于   isArray)。从服务器返回数据后,现有的   参考中填充了实际数据。

因此,您无需执行承诺,而是可以执行以下操作:

  var SomeThirdPartyFunction = function() {
    var getAComplextObject = function() {
      return {
        number: 42,
        method: function() {
          return this.number + 1;
        }
      };
    };

    var returnValue = {};

    $timeout(function() {
      console.log("Resolved!");
      Object.assign(returnValue, getAComplextObject());
    }, 1000);

    return returnValue;
  };

您可以将其包装在promise中,并将promise作为返回值的一部分,这样做可以使它成为可兑现的(又名Promise)

答案 1 :(得分:1)

幕后,$resource使用angular.copy

function myResourceGet(params) {
    var emptyObj = {};
    emptyObj.$resolved = false;
    emptyObj.$promise = $http.get(url, {params:params})
      .then(function(response) {
        angular.copy(response.data, emptyObj);
    }).finally(function() {
        emptyObj.$resolved = true;
    });
    return emptyObj;
}

从文档中:

  

angular.copy概述

     

创建source的深层副本,该副本应该是对象或数组。

     
      
  • 如果提供了目标,则将删除其所有元素(用于数组)或属性(对于对象),然后将源中的所有元素/属性复制到该目标。
  •   

$ resource服务仅在数据是对象或数组时有效。它不适用于字符串或数字之类的原语。