即使数据肯定返回,为变量分配ajax fetch函数也会返回undefined?

时间:2015-08-17 13:24:10

标签: javascript jquery ajax

我有一个数据提取函数getAvailableDates我通过分配变量AVAILABLE_DATES来调用,在done回调中我注销了响应并且我的数据在那里但是返回数据和注销变量返回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()
    };
});

1 个答案:

答案 0 :(得分:1)

使用$ .ajax返回的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>