Angular的链式承诺。输入参数错误

时间:2014-10-23 09:51:29

标签: javascript angularjs promise

我遇到了链式承诺的问题。

  1. 我模拟了后端来模拟ajax请求。

    $httpBackend.whenGET('/contacts').respond(function(method,url,data) {
        console.log("Getting contacts");
    
    return [200, contacts, {}];
    });
    
  2. 在我的服务 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 );
            }
    }
    
  3. 从服务我回复承诺
  4. 然后在我的 ContactController 中我再链接一个处理程序,将此值设置到范围内。

    ContactsService.getContact(index).then(function(data) {
        console.log("Data in ContactController: " + data);
        if (data) {
            $scope.contact = data;
        } else {
            console.log("No such index");
        }
    });
    

    但是在最后一个处理程序中(我将结果设置为范围)未定义的数据对象,即使我从服务中的处理程序返回对象。

  5. 我的代码有什么问题 - jsfiddle? 谢谢。

    谢谢。

1 个答案:

答案 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也可以更简单。

快乐的编码。