2015-08-17 98 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>