我正在尝试包装第三方库,以返回一个解析为对象的对象,该对象可以在视图中显示,类似于$ 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的示例。
答案 0 :(得分:1)
认识到调用$ 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服务仅在数据是对象或数组时有效。它不适用于字符串或数字之类的原语。