簡體   English   中英

從JavaScript中的函數獲取JSON

[英]Getting JSON from a Function in javascript

因此,這將是很多代碼,但是重要的是第22-25行和第87-91行。 其余代碼工作正常。 我有一個嵌套函數,想返回JSON字符串。 使用console.log可以告訴它運行正常,但是不會返回JSON字符串。 尋找說// ---------這部分-------的部分。 我要問的是兩部分。

exports.post = function(request, response) {

    var mssql = request.service.mssql;       
    //var data = '{"userID":"ryan3030@vt.edu1"}';
    var inputJSON = request.body.JSONtext;
    var json = JSON.parse(inputJSON);
    var userID = json.userID;

    mssql.query("EXEC getMeetingInfo ?", [userID],  
    {
        success: function(results3) {    
            var meetingsToday = results3.length;

            var meetingID = results3[0].meetingID;
            var meetingName = results3[0].meetingName;
            var meetingDescription = results3[0].meetingDescription;
            var meetingLength = results3[0].meetingLength;
            var meetingNotes = results3[0].meetingNotes;
            var hostUserID = results3[0].hostUserID;

//--------------------------------------THIS PART------------------------------        
      var JSONfinal = allInfoFunction(mssql, meetingID, userID, meetingName, meetingDescription, meetingLength, meetingNotes, hostUserID, meetingsToday);                     
      console.log(JSONfinal);//DOES NOT WORk
      response.send(statusCodes.OK, JSONfinal);//DOES NOT WORK
//---------------------------------BETWEEN THESE----------------------------------                
      },
      error: function(err) {
            console.log("error is: " + err);
            response.send(statusCodes.OK, { message : err });
      }
    });

};

function allInfoFunction(mssql, meetingID, userID, meetingName, meetingDescription, meetingLength, meetingNotes, hostUserID, meetingsToday){
    mssql.query("EXEC getLocation ?", [meetingID],  
                { success: function(results2) {
                            var meetingLocation = results2[0].meetingLocation;
                            var JSONlocation = {"meetingLocation": meetingLocation};

                                mssql.query("EXEC getDateTime ?", [meetingID],  
                                { success: function(results1) {
                                            var length = results1.length;
                                            var dateTime = [];
                                            dateTime[0] = results1[0].meetingDateTime;
                                            for (var x= 1; x < length; x++) {
                                                dateTime[x] =  results1[x].meetingDateTime;
                                            }
                                            //console.log(dateTime);

                                                mssql.query("EXEC getDateTimeVote",  
                                                { success: function(results) {
                                                        //console.log(results);
                                                        var JSONoutput2 = {};
                                                        var JSONtemp = [];
                                                        var length2 = results.length; 
                                                        for(var j = 0; j < length; j++){
                                                            var vote = false;
                                                            var counter = 0;
                                                            for(var z = 0; z < length2; z++){
                                                                var a = new Date(results[z].meetingDateTime);
                                                                var b = new Date(results1[j].meetingDateTime);
                                                                if(a.getTime() === b.getTime()){
                                                                    counter = counter + 1;
                                                                }
                                                                if((a.getTime() === b.getTime()) && (results[z].userID == userID)){
                                                                    vote = true;
                                                                }
                                                            }
                                                            var meetingTimeInput = {"time": b, "numVotes": counter, "vote": vote}
                                                            JSONtemp.push(meetingTimeInput);
                                                            JSONoutput2.meetingTime = JSONtemp;

                                                        }

                                                        var JSONfinal = {};
                                                        var mainInfoArray = [];

                                                        var JSONmainInfo = {meetingID: meetingID, meetingName: meetingName, meetingDescription: meetingDescription, meetingLength: meetingLength, meetingNotes: meetingNotes, hostUserID: hostUserID, meetingLocation: meetingLocation };
                                                        JSONmainInfo.meetingTime = JSONtemp;

                                                        JSONfinal.numMeetingsToday = meetingsToday;
                                                        mainInfoArray.push(JSONmainInfo);
                                                        JSONfinal.meetingList = mainInfoArray;
                                                        //response.send(statusCodes.OK, JSONfinal);

//---------------------------------------AND THIS PART-------------------------------                                                        
                                                        console.log(JSON.stringify(JSONfinal));//This outputs the correct thing
                                                        var lastOne = JSON.stringify(JSONfinal);
                                                        return lastOne; //ths dosent work 
//-------------------------------------BETWEEN THESE-----------------------------------

                                                },
                                                  error: function(err) {
                                                        console.log("error is: " + err);
                                                        //response.send(statusCodes.OK, { message : err });
                                                  }
                                                });       
                                },
                                  error: function(err) {
                                        console.log("error is: " + err);
                                        //response.send(statusCodes.OK, { message : err });
                                  }
                                });          
                },
                  error: function(err) {
                        console.log("error is: " + err);
                        //response.send(statusCodes.OK, { message : err });
                  }
                });
}

我對您的代碼做了一些重構,以采用更加模塊化的方法。 調試上面的內容變得非常棘手。 這里是:

exports.post = function(request, response) {
    var mssql = request.service.mssql;       
    var inputJSON = request.body.JSONtext;
    var json = JSON.parse(inputJSON);
    var userID = json.userID;

    var JSONFinal = {};

    getMeetingInfo(userID);

    function getMeetingInfo(userID){    
        mssql.query("EXEC getMeetingInfo ?", [userID], {
            success: function(results){
                JSONFinal.meetingsToday = results.length;
                JSONFinal.meetingID = results[0].meetingID;
                JSONFinal.meetingName = results[0].meetingName;
                JSONFinal.meetingDescription = results[0].meetingDescription;
                JSONFinal.meetingLength = results[0].meetingLength;
                JSONFinal.meetingNotes = results[0].meetingNotes;
                JSONFinal.hostUserID = results[0].hostUserID;

                // Call next function
                getLocation(JSONFinal);
            },
            error: function(err) {
                console.log("error is: " + err);
                response.send(statusCodes.OK, { message : err });
            }
        });
    }

    function getLocation(){
        mssql.query("EXEC getLocation ?", [JSONFinal.meetingID], { 
            success: function(results) {
                JSONFinal.meetingLocation = results[0].meetingLocation;

                // Call next function
                getDateTime(JSONFinal);
            },
            error: function(err) {
                console.log("error is: " + err);
            }
        });     
    }

    function getDateTime(){
        mssql.query("EXEC getDateTime ?", [JSONFinal.meetingID], { 
            success: function(results) {
                var length = results.length;
                var dateTime = [];
                for (var x= 0; x < length; x++) {
                    dateTime[x] =  results[x].meetingDateTime;
                }

                // Call next function
                getDateTimeVote(dateTime);
            },
            error: function(err){
                console.log("error is: " + err);    
            }
        });                                  
    }

    function getDateTimeVote(dateTime){
        mssql.query("EXEC getDateTimeVote", { 
            success: function(results) {
                var JSONtemp = [];
                var length2 = results.length; 

                for(var j = 0; j < dateTime.length; j++){
                    var vote = false;
                    var counter = 0;
                    for(var z = 0; z < length2; z++){
                        var a = new Date(results[z].meetingDateTime);
                        var b = new Date(results1[j].meetingDateTime);
                        if(a.getTime() === b.getTime()){
                            counter = counter + 1;
                        }
                        if((a.getTime() === b.getTime()) && (results[z].userID == userID)){
                            vote = true;
                        }
                    }
                    var meetingTimeInput = {"time": b, "numVotes": counter, "vote": vote}
                    JSONtemp.push(meetingTimeInput);
                }

                var JSONmainInfo = {
                    meetingID: JSONFinal.meetingID, 
                    meetingName: JSONFinal.meetingName, 
                    meetingDescription: JSONFinal.meetingDescription, 
                    meetingLength: JSONFinal.meetingLength, 
                    meetingNotes: JSONFinal.meetingNotes, 
                    hostUserID: JSONFinal.hostUserID, 
                    meetingLocation: JSONFinal.meetingLocation 
                    meetingTime: JSONtemp
                };

                var JSONfinal = {
                    numMeetingsToday: JSONFinal.meetingsToday,
                    meetingsList: [JSONmainInfo]
                };

                // Call next function
                sendResponse(JSON.stringify(JSONfinal));
            },
            error: function(err) {
                console.log("error is: " + err);
            }
        });   
    }

    function sendResponse(data){
        response.send(statusCodes.OK, data);
    }
};

看起來很不一樣,但功能幾乎相同。 查看代碼的關鍵是,每個后續功能僅在上一個功能成功之后才執行。 這有效地將方法鏈接在一起,以便它們始終按順序執行,並且是區別的關鍵。

這里要注意的一件事是

allInfoFunction(...

和我的

getMeetingInfo(userID)

在將MSSQL查詢發送到服務器后,這兩個函數都會立即或多或少返回undefined 這是因為請求是異步觸發的,而javascript會繼續在代碼中運行。 在觸發異步請求之后,該函數無需執行任何操作,因此返回。 沒有指定return值,因此它不返回任何值(如果願意,則undefined )。

因此,總的來說,問題代碼中的代碼將返回未定義的狀態,然后嘗試在實際發生任何事情之前發送響應。 此代碼通過在執行所有查詢后觸發sendResponse解決此問題。

我在文本編輯器中重構了此代碼,但沒有運行它,也沒有檢查它是否有錯誤,因此請按照自己喜歡的基本大綱進行操作,但復制並粘貼它而不檢查其是否損壞可能不是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM