2011-04-04 79 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/

相關問題