2013-01-22 38 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刚刚举了一个很好的例子,如何做到这一点 –