简体   繁体   中英

Call to Factory-defined method returning undefined value/promise

I have an intricate and complex (not my code) factory call in Angular that when used, doesn't return a then property or anything that can be used to run a successCallback method (error itself is TypeError: Cannot read property 'then' of undefined ). I'm not sure what the cause could be, but there are quite a few unique components of the call that could be the cause, such as the multiple nested $http.post calls to the Web Service.

    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;
            }
        );
    }

The referring method call (inside a Controller, fired on a click event)

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

                    });

Is it possible that in fact, the call for updateDocument is getting a return long before the Promises send anything back? If so, what are my options to work around it?

Your updateDocument function doesn't return anything. Add return before the getDocumentRecordById call.

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

You need to return the promise object like this:

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;
        }
    );
}

You should return the factory object based on your code. Example...

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

You can return your code like below.

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;
            }
        );
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM