2015-02-08 128 views
0

我有这样的事情:

var someJSON = function(){ 

    // Calculate some stuff here 

    $.ajax({ 
    dataType: "json", 
    url: "http://somewebsite.com/api/?callback=?", 
    async: false, 
    success: function(data) { 
     return data; // How can I return this so that someJSON gets this value? 
    } 
    }); 

}(); 

console.log(someJSON); // I want someJSON to be = data from the ajax call 

从本质上讲,我想someJSON到最终被认为是通过AJAX返回该JSON数据的价值。但是,如何从嵌套$.ajax调用返回值?我可以使用某种回调函数来回传值吗?

另外,我正在使用async: false,因此脚本的其余部分不会尝试执行,直到someJSON有一个值集。这是做到这一点的正确方法吗?

+0

@PHPglue他使用'async:false',所以它不是异步的。 – Barmar 2015-02-08 07:14:33

+1

请不要使用同步ajax。你的用户会感谢你不锁定他们的浏览器。 – jfriend00 2015-02-08 07:18:57

+0

当您从回调函数返回数据时,它会回到回调的调用者(进入ajax的内部),而不是函数的返回值。无论是同步还是异步,从成功处理程序返回值都不是向外界传递ajax值的方式。 – jfriend00 2015-02-08 07:19:54

回答

3

由于您使用async: false,你可以简单地设置一个变量,并从原来的函数返回它:

var someJSON = function(){ 
    var returnVal; 

    // Calculate some stuff here 

    $.ajax({ 
     dataType: "json", 
     url: "http://somewebsite.com/api/?callback=?", 
     async: false, 
     success: function(data) { 
      returnVal = data; 
     } 
    }); 
    return returnVal; 
}(); 

然而,你应该好好想想你是否真的需要使用同步AJAX,因为这可以阻止浏览器。您应该学习使用异步调用的正确方法。见

How do I return the response from an asynchronous call?
Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

+1

我真的认为这是帮助人们解决同步ajax调用问题,但至少不会解释用于更好地为用户提供异步ajax调用的优点和技术。是的,我知道这就是他们所问的,但人们并不总是提出正确的问题,往往需要朝着更好的方向发展。 – jfriend00 2015-02-08 07:22:07

1

你只能通过一个同步Ajax调用做到这一点:

var someJSON = function(){ 
    // Calculate some stuff here 
    var retVal = null 
    $.ajax({ 
    dataType: "json", 
    url: "http://somewebsite.com/api/?callback=?", 
    async: false, 
    success: function(data) { 
     retVal = data; 
    } 
    }); 
    return retVal; 
}; 

console.log(someJSON()); 

然而,请谨慎做到这一点。一般来说,它是更好的,更安全,更快地使用异步调用:

var someCalculatedObject = {}; 
function handleReturn(data) 
{ 
    // process JSON. 
} 
$.ajax({ 
    dataType: "json", 
    url: "http://somewebsite.com/api/?callback=?", 
    async: true, 
    data:someCalculatedObject 
    success: handleReturn 
    }); 
+0

您的任一代码块都不起作用。第一个是异步调用错误。即使是同步呼叫,第二个也不正确。也许你在两个方向都得到了异步标志? – jfriend00 2015-02-08 07:21:25

+0

您的两个代码块中有同步和异步反向。 – Barmar 2015-02-08 07:23:26

+0

我一定是让他们倒退了。至少他们周围的文字是正确的。 :) – 2015-02-08 07:31:39

0

你可以尝试这样的

DEMO

function someJSON() { 
    var resp = $.ajax({ 
    dataType: "json", 
    url: "http://somewebsite.com/api/?callback=?" 
    }) 
    .success(function (data) { 
    }); 
    return resp; 
}; 


someJSON().success(function (data) { 
    console.log(data); 
}); 

希望这会有所帮助,谢谢。

+0

您的DEMO显示'myjson'作为一个对象而不是响应数据返回。 – 2015-02-08 15:16:50

+0

@Jakobud数据类型以json的形式给出,因此它会将数据重新定位为json对象 – SarathSprakash 2015-02-09 10:58:14

+0

但返回的对象是XHR对象。不是JSON数据对象。只要看看上面DEMO2提琴的控制台。我在这里错过了什么吗? – 2015-02-09 17:31:42