2015-08-17 95 views
0

我有一個數據獲取功能getAvailableDates,我呼籲通過分配一個變量AVAILABLE_DATES,在done回調我註銷響應和我的數據在那裏,但返回數據並註銷變量返回undefined。任何人都可以解釋我可能會出錯嗎?即使數據肯定返回,將ajax提取函數賦值給變量也會返回undefined?

define([ 
    'jquery' 
], function (
    $ 
) { 

    "use strict"; 

    function getAvailableDates() { 
     console.log('Running getAvailableDates'); 

     var requestAvailableDates = $.ajax({ 
      type: "GET", 
      url: 'api/dcgdates', 
      data: JSON.stringify(requestAvailableDates), 
      dataType: "json", 
      contentType: "application/json" 
     }); 

     requestAvailableDates.done(function(data) { 
      console.log('getAvailableDates success', data); 
      return data; 
     }); 
    } 

    return { 

     DATE_FORMAT: "dd M yy", 
     AVAILABLE_DATES: getAvailableDates() 
    }; 
}); 
+0

因爲之前的數據是獲取你的日誌執行。 – fuyushimoya

+0

哦,我該怎麼推遲? – styler

+0

你需要使用回調..你不能從AJAX呼叫「返回」 – tymeJV

回答

1

使用deferred返回由$阿賈克斯,當你用它來記錄數據,其可鏈接的,你可以寫:

var request = $.ajax(...); 
// This will return the deferred object. And you can keep call `.done` on it to chain the callbacks. 
return request.done(...).done(...); 

所有.done鏈的回調將接收來自您的ajax請求的相同數據。

define(['jquery'], function($) { 
    "use strict"; 
    function getAvailableDates() { 
     console.log('Running getAvailableDates'); 

     var requestAvailableDates = $.ajax({ 
      type: "GET", 
      url: 'api/dcgdates', 
      data: JSON.stringify(requestAvailableDates), 
      dataType: "json", 
      contentType: "application/json" 
     }); 

     // Return a deferred object. 
     return requestAvailableDates.done(function(data) { 
      console.log('getAvailableDates success', data); 
      return data; 
     }); 
    } 

    return { 
     DATE_FORMAT: "dd M yy", 
     deferredObj: getAvailableDates() 
    }; 
}); 

然後你就可以獲取對象和用途:

returnObj.deferredObj.done(function(data) { 
    // do something...... 
}); 

要得到它的價值。

下面是顯示如何使用它的片段。

var test = function() { 
 
    var dfd = $.Deferred(); 
 
    
 
    setTimeout(function() { 
 
    dfd.resolve(1); 
 
    }, 3000); 
 
    
 
    // Each .done returns the deferred object, which can be chained to more callbacks. 
 
    // And they'll execute in the order you chained them. 
 
    return dfd 
 
    .done(function(val) { 
 
     console.log(val); 
 
    }) 
 
    .done(function(val) { 
 
     console.log('another ' + val); 
 
    }); 
 
    
 

 
}; 
 

 
var deferred = test(); 
 

 
// The return deferred object can keep chaining to get the value. 
 
// You can write your logic here to handle the data when deferred resolved. 
 
deferred.done(function(val) { 
 
    console.log('I got the same value: ' + val); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>