ajax调用(jquery)中的回调未按预期返回

时间:2015-07-07 16:10:56

标签: jquery ajax

我想要实现的非常简单:将Instagram的API中的对象放在变量中,这样我就可以随意使用它。这是我到目前为止所做的:

$(document).ready(function() {
// initialize var already
var instagram_infos;

function get_instagram_feed(callback) {
    var client_id = 'f6014154300f41ec98aw8dw087e49096';
    var user_id = "1681116416";
    $.ajax({
        url: 'https://api.instagram.com/v1/users/'+user_id+'/media/recent/',
        dataType: 'jsonp',
        type: 'GET',
        data: {client_id: client_id},
        success: callback,
        error: function(data){
            console.log(data);
        }
    });
}

function callback_instagram(result) {
    instagram_infos = result;
}

get_instagram_feed(callback_instagram);

console.log(instagram_infos);
});

正如你所看到的,我正在通过我的成功ajax传递一个回调函数,在我的回调中,我只想把Instagram中的对象放回我的变量instagram_infos中。 Tho,这不起作用,当我在console.log上我的instagram_infos变量时,它说:undefined。我想这是AJAX异步调用的问题,但我不是这方面的专家= /还在学习它...我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您需要考虑AJAX调用是异步的,因此在调用AJAX函数后,您不能指望在instagram_infos中有值。您需要等待AJAX​​调用的响应。你可以使用“承诺”。我正在与您分享可能对您有帮助的链接:

https://api.jquery.com/promise/

https://api.jquery.com/jquery.when/

答案 1 :(得分:2)

问题是AJAX将异步执行。因此callback_instagram实际上会在function get_instagram_feed() { var client_id = 'f6014154300f41ec98aw8dw087e49096'; var user_id = "1681116416"; return $.ajax({ // $.ajax will return a Promise (well really a Deferred Object) url: 'https://api.instagram.com/v1/users/'+user_id+'/media/recent/', dataType: 'jsonp', type: 'GET', data: {client_id: client_id} }); } get_instagram_feed().then(function(instagram_infos) { // now you have whatever instagram sends back. }).fail(function(err) { // deal with error }) 之前运行。

你最好不要使用诺言。

UPDATE table2 
  set table2.period = table1.period,
      table2.weekfield = CASE
         WHEN table2.datefield between table1.date1 and table1.date2 then 1
         WHEN table2.datefield between table1.date2 and table1.date3 then 2
         WHEN table2.datefield between table1.date3 and table1.date4 then 3
         ELSE NULL
         END
  from table2 
  inner join table1 on (whatever)
  where table2 (whatever)

the directory of the script

答案 2 :(得分:1)

请记住,AJAX是异步的,因此当没有返回数据时,您将输出到控制台,并且没有为instagram_infos变量分配值。

你可以做的不是在AJAX方法中嵌套你的成功回调,而是可以监听promise对象,它由jQuery中的$.ajax()方法原生返回:

$(document).ready(function() {

// Set up variables needed for AJAX call
var instagram_infos,
    client_id = 'f6014154300f41ec98aw8dw087e49096',
    user_id = '1681116416',
    get_instagram_feed = $.ajax({
        url: 'https://api.instagram.com/v1/users/'+user_id+'/media/recent/',
        dataType: 'jsonp',
        type: 'GET',
        data: { client_id: client_id }
    });

// Listen to promise object returned
get_instagram_feed
.done(function(data) {
    // When AJAX call is successful
    console.log(data);
    instagram_infos = data;
})
.fail(function(data) {
    // When AJAX call has failed
    console.log(data);
});

请注意,instagram_infosjqXHR.done()函数外部访问null时将返回.done(),但是否则会返回正确的数据,因为{{1}}函数等待AJAX​​调用在触发之前完成,因此将正确的值绑定到变量。