2011-04-04 64 views
0

所以我使用mootools,并且我有一个调用ajax脚本来获取值的函数。该值然后在函数中返回。但是,出于某种原因,该函数返回的AJAX调用速度太快!仅当ajax调用完成时才返回函数中的值?

我在做什么错?

function getCredits() { 
    var loadGlobalTab = new Request.JSON({ 
     url: {my api, url removed for security}, 
     evalScripts : true, 
     async: false, // I tried this, hoping it would stop the function from returning too soon, but no dice. 
     onSuccess: function(returnInfo) { 
      alert(returnInfo.data.total); 
      return returnInfo.data.total; 
     } 
    }).send(sendData); // Where sendData has been defined prior 
} 

警报返回正确的值,所以我知道AJAX调用的作品,然而,函数本身没有返回,也就是说,虽然AJAX调用正在该功能立即结束。

我试图把一个return 100底,只是踢,函数返回100

回答

2

AJAX是asynchronous

意思就是说JS将通过它的权利和阅读,如果没有返回正确的,然后,那么什么都没有。

好事做的是一个回调,而不是一回:

function getCredits() { 
    var loadGlobalTab = new Request.JSON({ 
     url: {my api, url removed for security}, 
     evalScripts : true, 
     headers: {'ACCEPT': 'json','X_REQUESTED_WITH':'jsonhttprequest'}, 
     onSuccess: function(returnInfo) { 
      alert(returnInfo.data.total); 
      //goto callback 
      getCredits_Callback(returnInfo.data.total); 
     } 
    }).send(sendData); // Where sendData has been defined prior 
} 

function getCredits_Callback(total){ 
    //do something with total 
} 

第二个办法:

function getCredits() { 
    var loadGlobalTab = new Request.JSON({ 
     url: {my api, url removed for security}, 
     evalScripts : true, 
     headers: {'ACCEPT': 'json','X_REQUESTED_WITH':'jsonhttprequest'}, 
     onSuccess: getCredits_Callback 
    }).send(sendData); // Where sendData has been defined prior 
} 

function getCredits_Callback(returnInfo){ 
    //do something with returnInfo 
} 
+0

宾果。我应该问我的as3 dev。该死的。谢谢尼尔! – 2011-04-04 16:11:21

+0

该死,打我。 :D – jlindenbaum 2011-04-04 16:11:54

+0

哈哈没问题^ _^ – Neal 2011-04-04 16:12:04

1

它返回什么,因为你的return语句返回到的属性一个对象,而不是你认为它返回的变量。你最好将你的“onSuccess”函数传递给一个单独的处理函数。这样你可以处理闭包之外的返回值。

+0

可惜upvote?大声笑 – 2011-04-04 16:15:19

4

编辑哦,亲爱的。因打电话而遭到殴打。没关系!

ajax是异步的,使用async:false只是错误的方法。相反,使用onComplete/onSuccess直接调用的查询结果运行第二个回调函数。

如果你真的必须这样做,所以块,那么这个工作得很好:

var blockingCheck = function() { 
    var obj = {}; 
    new Request.JSON({ 
     url: '/echo/json/', 
     data: { 
      json: JSON.encode({ 
       text: 'some text', 
       array: [1, 2, 'three'], 
       object: { 
        par1: 'another text', 
        par2: [3, 2, 'one'], 
        par3: {} 
       } 
      }), 
      delay: 3 
     }, 
     async: false, 
     onSuccess: function(response) { 
      obj = response; 
     } 
    }).send(); 

    return obj; 
}; 

console.log(blockingCheck()); 

http://jsfiddle.net/dimitar/eG4t2/

相关问题