我遇到了链式承诺的问题。
我模拟了后端来模拟ajax请求。
$httpBackend.whenGET('/contacts').respond(function(method,url,data) {
console.log("Getting contacts");
return [200, contacts, {}];
});
在我的服务 ContactsService 中,我进行了这个ajax调用并链接一个处理程序,以从数据(这是一组联系人)中提取一些索引。
self.getContact = function(index) {
var handler = new self.ResultHandler(index, self.handleContactSuccess);
return $http.get("/contacts").then(handler.handleResult, self.handleError);
}
self.handleContactSuccess = function( response ) {
var resultHandler = this;
var index = resultHandler.getAdditionalData();
if (index < response.data.length) {
return( response.data[index]);
} else {
return( null );
}
}
然后在我的 ContactController 中我再链接一个处理程序,将此值设置到范围内。
ContactsService.getContact(index).then(function(data) {
console.log("Data in ContactController: " + data);
if (data) {
$scope.contact = data;
} else {
console.log("No such index");
}
});
但是在最后一个处理程序中(我将结果设置为范围)未定义的数据对象,即使我从服务中的处理程序返回对象。
我的代码有什么问题 - jsfiddle? 谢谢。
谢谢。
答案 0 :(得分:1)
您的问题是您没有正确委派。 Promise依赖返回值。你大部分时间都是正确地遵循这个,但是当你试图申请授权时,你错过了一个回报:
self.handleResult = function (data) {
handleResultFunc.call(self, data);
};
这在promises中意味着“立即返回undefined”,因为JavaScript具有隐式undefined
返回。相反,您应该return
结果:
self.handleResult = function (data) {
return handleResultFunc.call(self, data);
};
总体而言 - 如果您在代码中使用了更简单的结构,我认为您可以避免这个问题 - 但我可能不了解您拥有的更广泛的设计限制。作为替代方案 - 您可以通过闭包引用self
并简单地执行self.handleResult = handleResultFunc
也可以更简单。
快乐的编码。