调用Factory定义的方法返回未定义的值/ promise

时间:2017-03-31 19:13:40

标签: javascript angularjs

我在Angular中有一个错综复杂的(不是我的代码)工厂调用,在使用时,不返回then属性或任何可用于运行successCallback方法的东西(错误本身是TypeError: Cannot read property 'then' of undefined) 。我不确定原因是什么,但是调用中有很多独特的组件可能是原因,例如多次嵌套的$ http.post调用Web服务。

    updateDocument: function(documentId,  newFileData, appointmentFileName = null, appointmentCategory = null, appointmentId = null) {
        //Get Existing Document Details (including Revision)
        //document.
        documentsService.documentsFactory.getDocumentRecordById(documentId).then(
            function successCallback(response) {
                console.debug("Response", response);

                var NextRevision = parseInt(response.data.revision) + 1;

                if ((appointmentCategory === null) || (appointmentCategory === undefined)) {
                    appointmentCategory = response.data.category_id;
                }

                if ((appointmentId === null) || (appointmentId === undefined)) {
                    var ErrorObj = {
                        status: 10,
                        message: 'Appointment ID not defined.'
                    };
                    return ErrorObj;
                }

                if ((appointmentFileName === null) || (appointmentFileName === undefined)) {
                    appointmentFileName = response.data.filename;
                }

                if ((newFileData === null) || (newFileData === undefined)) {
                    var ErrorObj = {
                        status: 11,
                        message: 'File Data not defined.'
                    };
                    return ErrorObj;
                }

                var action = 'set_document_revision';
                var endpoint = cfg.url;
                var sessionId = systemService.sessionService.getSessionId();

                var DocRevObj = {
                    session: sessionId, 
                    document_revision: {
                        id: documentId,
                        file: newFileData,
                        filename: appointmentFileName,
                        revision: NextRevision                        
                    }
                };

                var DocNodeObj = {
                    session: sessionId,
                    module: "Documents",
                    name_value_list: [{
                        name: 'document_name',
                        value: appointmentFileName
                    }, {
                        name: 'category_id',
                        value: appointmentCategory
                    }, {
                        name: 'id',
                        value: documentId
                    }]                      
                };

                var RevisionRequestParams = {
                    method: action,
                    input_type: "JSON",
                    response_type: "JSON",
                    rest_data: DocRevObj
                };

                var NodeRequestParams = {
                    method: "set_entry",
                    input_type: "JSON",
                    response_type: "JSON",
                    rest_data: DocNodeObj
                }

                var headers = {
                    "Content-Type": "application/json"
                };

                return $http.post(endpoint, RevisionRequestParams, headers).then(
                    function successCallback(response2) {
                        console.debug("Successfully Replaced File", response2);

                        //Re-adjust the File Entry to match new changes
                        //(make a call to set_entry)
                        return $http.post(endpoint, NodeRequestParams, headers).then(
                            function successCallback(response3) {
                                console.debug("Successfully Updated File", response3);
                                return response3;
                            },
                            function errorCallback(response3) {
                                console.debug("Error", response3);
                                return response3
                            }
                        );

                        return response2;
                    },
                    function errorCallback(response2) {
                        console.debug("Error", response2);
                        return response2;
                    }
                ); 
                console.debug("Success", response);
                return response;
            }, function errorCallback(response) {
                console.debug("Error", response);
                return response;
            }
        );
    }

引用方法调用(在Controller内部,在click事件中触发)

appointmentsService.appointmentsFactory.updateDocument(CurrentDocumentId, result, NewFileName, NewDocumentType, CurrentAppointmentID).then(
                    function successCallback(response) {
                        //Success Callback Logic                        
                    },
                    function errorCallback(response) {

                    });

事实上,在Promises发回任何东西之前,对updateDocument的调用是否有可能获得一个返回?如果是这样,我有什么选择解决它?

3 个答案:

答案 0 :(得分:4)

您的updateDocument函数不会返回任何内容。在getDocumentRecordById调用之前添加return。

var updateDocument = function(documentId, newFileData, appointmentFileName = null, appointmentCategory = null, appointmentId = null) {
//Get Existing Document Details (including Revision)
//document.
return documentsService.documentsFactory.getDocumentRecordById(documentId).then( 
...

答案 1 :(得分:0)

你需要像这样返回promise对象:

updateDocument: function(documentId,  newFileData, appointmentFileName = null, appointmentCategory = null, appointmentId = null) {
    //Get Existing Document Details (including Revision)
    //document.
    return documentsService.documentsFactory.getDocumentRecordById(documentId).then(
        function successCallback(response) {
            console.debug("Response", response);

            var NextRevision = parseInt(response.data.revision) + 1;

            if ((appointmentCategory === null) || (appointmentCategory === undefined)) {
                appointmentCategory = response.data.category_id;
            }

            if ((appointmentId === null) || (appointmentId === undefined)) {
                var ErrorObj = {
                    status: 10,
                    message: 'Appointment ID not defined.'
                };
                return ErrorObj;
            }

            if ((appointmentFileName === null) || (appointmentFileName === undefined)) {
                appointmentFileName = response.data.filename;
            }

            if ((newFileData === null) || (newFileData === undefined)) {
                var ErrorObj = {
                    status: 11,
                    message: 'File Data not defined.'
                };
                return ErrorObj;
            }

            var action = 'set_document_revision';
            var endpoint = cfg.url;
            var sessionId = systemService.sessionService.getSessionId();

            var DocRevObj = {
                session: sessionId, 
                document_revision: {
                    id: documentId,
                    file: newFileData,
                    filename: appointmentFileName,
                    revision: NextRevision                        
                }
            };

            var DocNodeObj = {
                session: sessionId,
                module: "Documents",
                name_value_list: [{
                    name: 'document_name',
                    value: appointmentFileName
                }, {
                    name: 'category_id',
                    value: appointmentCategory
                }, {
                    name: 'id',
                    value: documentId
                }]                      
            };

            var RevisionRequestParams = {
                method: action,
                input_type: "JSON",
                response_type: "JSON",
                rest_data: DocRevObj
            };

            var NodeRequestParams = {
                method: "set_entry",
                input_type: "JSON",
                response_type: "JSON",
                rest_data: DocNodeObj
            }

            var headers = {
                "Content-Type": "application/json"
            };

            return $http.post(endpoint, RevisionRequestParams, headers).then(
                function successCallback(response2) {
                    console.debug("Successfully Replaced File", response2);

                    //Re-adjust the File Entry to match new changes
                    //(make a call to set_entry)
                    return $http.post(endpoint, NodeRequestParams, headers).then(
                        function successCallback(response3) {
                            console.debug("Successfully Updated File", response3);
                            return response3;
                        },
                        function errorCallback(response3) {
                            console.debug("Error", response3);
                            return response3
                        }
                    );

                    return response2;
                },
                function errorCallback(response2) {
                    console.debug("Error", response2);
                    return response2;
                }
            ); 
            console.debug("Success", response);
            return response;
        }, function errorCallback(response) {
            console.debug("Error", response);
            return response;
        }
    );
}

答案 2 :(得分:0)

您应该根据代码返回工厂对象。    实施例...

 app.factory('factoryName', function() {
     var factoryObj= { 
      save: function() {
      },
    update: function() {
    }
  };
   return factoryObj; //return object
 });

您可以返回如下代码。

return {
updateDocument: function(documentId,  newFileData, appointmentFileName = null, appointmentCategory = null, appointmentId = null) {
        //Get Existing Document Details (including Revision)
        //document.
        documentsService.documentsFactory.getDocumentRecordById(documentId).then(
            function successCallback(response) {
                console.debug("Response", response);

                var NextRevision = parseInt(response.data.revision) + 1;

                if ((appointmentCategory === null) || (appointmentCategory === undefined)) {
                    appointmentCategory = response.data.category_id;
                }

                if ((appointmentId === null) || (appointmentId === undefined)) {
                    var ErrorObj = {
                        status: 10,
                        message: 'Appointment ID not defined.'
                    };
                    return ErrorObj;
                }

                if ((appointmentFileName === null) || (appointmentFileName === undefined)) {
                    appointmentFileName = response.data.filename;
                }

                if ((newFileData === null) || (newFileData === undefined)) {
                    var ErrorObj = {
                        status: 11,
                        message: 'File Data not defined.'
                    };
                    return ErrorObj;
                }

                var action = 'set_document_revision';
                var endpoint = cfg.url;
                var sessionId = systemService.sessionService.getSessionId();

                var DocRevObj = {
                    session: sessionId, 
                    document_revision: {
                        id: documentId,
                        file: newFileData,
                        filename: appointmentFileName,
                        revision: NextRevision                        
                    }
                };

                var DocNodeObj = {
                    session: sessionId,
                    module: "Documents",
                    name_value_list: [{
                        name: 'document_name',
                        value: appointmentFileName
                    }, {
                        name: 'category_id',
                        value: appointmentCategory
                    }, {
                        name: 'id',
                        value: documentId
                    }]                      
                };

                var RevisionRequestParams = {
                    method: action,
                    input_type: "JSON",
                    response_type: "JSON",
                    rest_data: DocRevObj
                };

                var NodeRequestParams = {
                    method: "set_entry",
                    input_type: "JSON",
                    response_type: "JSON",
                    rest_data: DocNodeObj
                }

                var headers = {
                    "Content-Type": "application/json"
                };

                return $http.post(endpoint, RevisionRequestParams, headers).then(
                    function successCallback(response2) {
                        console.debug("Successfully Replaced File", response2);

                        //Re-adjust the File Entry to match new changes
                        //(make a call to set_entry)
                        return $http.post(endpoint, NodeRequestParams, headers).then(
                            function successCallback(response3) {
                                console.debug("Successfully Updated File", response3);
                                return response3;
                            },
                            function errorCallback(response3) {
                                console.debug("Error", response3);
                                return response3
                            }
                        );

                        return response2;
                    },
                    function errorCallback(response2) {
                        console.debug("Error", response2);
                        return response2;
                    }
                ); 
                console.debug("Success", response);
                return response;
            }, function errorCallback(response) {
                console.debug("Error", response);
                return response;
            }
        );
    }
}