0

这个问题其实是我对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
}

演员变量包含我需要的信息,但是我正在努力将变量从函数中取出。由于内部函数,它将贯穿并到达return 0;

如果我尝试将变量分配给内部函数,它将返回一个对象而不是返回变量。

任何正确方向的解决方案或指针将不胜感激。

4

4 回答 4

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);
于 2013-03-04T21:11:59.517 回答
1

虽然确实不能这样做,但我发现在我遇到的大多数情况下,这样的事情是一种可以接受的解决方法:

function getMeSomeJSON(query) {    
  return $.get("websit.com?title=" + query + "&type=json");
}

这会将请求的响应返回给调用它的任何内容。

或者,您可以:

  • 将响应传递给回调。
  • 将 $.ajax 与 async: false 一起使用,但是,这被认为是不好的做法。
于 2013-03-04T21:18:26.533 回答
0

阅读文档。它有一些示例,包括数据类型处理。一个简单的检查应该有助于确定返回什么。

于 2013-03-04T21:18:13.710 回答
0

正如您自己所注意到的,您的 ajax 响应处理程序在 actor 函数返回执行,因此返回值相当困难。标准解决方案是从参与者函数返回一个承诺。您可以在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
});
于 2013-03-04T21:22:03.423 回答