2013-01-22 85 views
1

該函數從數據庫中獲取問題並應返回該問題。 數據庫是一個Parse對象(https://www.parse.com/docs/js_guide)。正如代碼中的註釋所指出的那樣,問題可以從db調用的成功函數中訪問,但不能從外部訪問,只是簡單地將return語句放在成功塊中也不起作用。 下面的代碼。有什麼建議麼?變量不能在成功函數之外訪問

function getQuest(){ 

    var Question = Parse.Object.extend("Question"); 
    var query = new Parse.Query("Question"); 
    var questlist = []; 
    var newquestion; 
    //get list of questions if chosen track is python or java. track is set globally 

    if (track == "python") 
    { 

     query.equalTo("track", "xstsysysus7"); 

    } else if (track == "java"){ 

     query.equalTo("track", "XAWqBgxFAP"); 

    } 

    query.find({ 

     success: function(questions){ 
     // return list of questions 
      var i = Math.floor(Math.random()*10); 
      newquestion = questions[i].get('question'); 
      console.log(newquestion); // works here 

    }, 

     error: function(error){ 
      console.log(error.message); 
     } 


    }); 

    console.log(newquestion); //returns undefined here 
    return newquestion; 

} 
+1

我猜這是一個異步問題。是「成功」還是「query.find」異步調用?如果是這樣,那麼發生了什麼是正常的,你可以在SO上找到許多類似的答案。 – elclanrs

+0

你能指出一個在這種情況下會有幫助的SO問題嗎? – algorithmicCoder

+0

這應該有助於http://stackoverflow.com/search?q=javascript+async+variable – elclanrs

回答

7

您無法從這樣的回調方法返回,這是一個異步的問題,您應該使用一個回調方法從方法

function getQuest(callback){ 

var Question = Parse.Object.extend("Question"); 
var query = new Parse.Query("Question"); 
var questlist = []; 
var newquestion; 
//get list of questions if chosen track is python or java. track is set globally 

if (track == "python") 
{ 

    query.equalTo("track", "xstsysysus7"); 

} else if (track == "java"){ 

    query.equalTo("track", "XAWqBgxFAP"); 

} 

query.find({ 

    success: function(questions){ 
    // return list of questions 
     var i = Math.floor(Math.random()*10); 
     newquestion = questions[i].get('question'); 
     //call the callback method here and pass your variable as a param 
     if(callback != null && callback != undefined){ 
       callback(newquestion); 
     } 


}, 

    error: function(error){ 
     console.log(error.message); 
    } 


}); 

}

現在你能叫出讓你變你的getQuest方法就像這樣,而不是使用var newQ = getQuest()

getQuest(function(newQuestion){ 
    // do your stuff with newQuestion 
}) 
+0

超!謝謝。什麼是學習異步調用/回調的最佳資源? – algorithmicCoder

+0

好吧,最好的資源是谷歌'javascript異步函數'或'javascript回調函數'。你會發現很多資源。我不能特別提到任何人:s –

0

回調(成功和錯誤)是異步的。在函數返回之前,它們可能沒有被執行過。

+0

謝謝。任何想法如何解決這一問題? – algorithmicCoder

+0

讓您的功能進行回調,並從成功案例中調用該回調。或者閱讀jQuery延期和鏈承諾。 –

+1

@BurhanUddin剛剛舉了一個很好的例子,如何做到這一點 –