这个问题实际上是由于我没有完全理解jquery引起的。
我有一些代码,我试图将函数放入多次使用。
function actors(query){
$.get("websit.com?title=" + query + "&type=json", function(html){
var result = html;
var obj = eval ("(" + result + ")");
var actor = obj[0].actors;
return actor; //as far as im aware this does nothing
});
return 0; // gets here and returns zero, returning actor here returns undefined
}
actor变量保存了我需要的信息,但是我正在努力将变量从函数中删除。
由于内部功能,它将贯穿并到达return 0;
如果我尝试将一个变量赋给内部函数,它将返回一个对象,而不是返回变量。
非常感谢任何正确方向的解决方案或指示。
答案 0 :(得分:4)
这个问题每月被问到1000次。您不能将异步调用视为同步调用。这就是回调的用途。
你也在使用jQuery,没有必要使用eval!设置正确的内容类型,它将为您解析数据。
回调的基本理念
function actors(query, callback){
$.getJSON("websit.com?title=" + query + "&type=json", function(data) {
var actor = data[0].actors;
callback(actor);
});
}
function processResults(info){
console.log(info);
}
actors("Something", processResults);
答案 1 :(得分:1)
虽然这是真的你不能做到这一点,我发现在我遇到的大多数情况下,这样的事情是可接受的解决办法:
function getMeSomeJSON(query) {
return $.get("websit.com?title=" + query + "&type=json");
}
这将返回请求对任何调用它的响应。
或者,您可以:
答案 2 :(得分:0)
Read the documentation.它有一些例子,包括数据类型处理。一个简单的检查应该有助于确定返回什么。
答案 3 :(得分:0)
正如您已经注意到的那样,您的ajax响应处理程序在 actor函数返回后执行,从而使返回值变得相当困难。标准解决方案是从actor函数返回一个promise。您可以在jquery docs中阅读承诺或延期对象。
这是我的建议:
function actors(query){
var actorsPromise = $.Deferred();
$.get("websit.com?title=" + query + "&type=json", function(html){
var result = html;
var obj = eval ("(" + result + ")");
var actor = obj[0].actors;
actorsPromise.resolve(actor);
});
return actorsPromise;
}
actors(/* your query */).done(function(actor) {
//do whatever you need with your actor
});