0

谁能看到这段代码的问题?当返回 'out' 时,它的值为 ""。我不知道为什么,也许这与我不知道的 getJSON 函数有关。

我正在尝试将 URL 传递给此函数,让它在 URL 上执行 getJSON,并将结果(我也在格式化)添加到文本字符串中。我希望它们都在一个文本字符串中,所以我可以用正则表达式解析字符串。任何帮助表示赞赏,谢谢!

function getSearch(url) {
var out = '';   // output variable

$.getJSON(url, function(data) {
    for(var i = 0; i < numResults; i++) {
        out += '<p class="hash_list">' + '<a href="http://www.twitter.com/' + data.results[i].from_user + '">' + data.results[i].from_user + '</a>: ' + data.results[i].text + '</p>';
    }
});

return out;
}
4

3 回答 3

2

AJAX 是异步的。

您需要使用回调函数返回值,方法相同getJSON

function getSearch(url, callback) {
    $.getJSON(..., function() { 
        ...
        callback(...);
    });
}
于 2012-05-24T18:51:34.610 回答
2

ajax 是异步的,您拥有的代码将在 ajax 请求完成之前返回。有几种方法可以重构代码。

您可以传入一个回调函数,该函数在请求完成后执行。

function getSearch(url, callback) {
   $.getJSON(url, function(data) {
     var out = '';    
     // btw what is numResults ?? 
     for(var i = 0; i < numResults; i++) {
        out += '<p class="hash_list">' + '<a href="http://www.twitter.com/' + data.results[i].from_user + '">' + data.results[i].from_user + '</a>: ' + data.results[i].text + '</p>';
     }
     if( typeof callback === 'function' ) callback( out ); 
   });
}

然后你会使用这样的功能。

getSearch('test.php', function(out){ 
   // here you can use the out variable 
}); 

或者,您可以使用 jquery deferreds 返回一个 Promise 并在解决 deferred 时将 out 变量作为参数的一部分传递。这是一个例子

function getSearch() 
{    
    var deferred = $.Deferred(); 
    $.getJSON(url, function(data) {
     var out = '';    
     // btw what is numResults ?? 
     for(var i = 0; i < numResults; i++) {
        out += '<p class="hash_list">' + '<a href="http://www.twitter.com/' + data.results[i].from_user + '">' + data.results[i].from_user + '</a>: ' + data.results[i].text + '</p>';
     }
     deferred.resolve( out ); // resolve the request and pass in the out argument.  
   });

    return deferred.promise(); // return a promise 
}


$.when( getSearch() ).then(function( out ){  // the out variable will get passed in
     console.log( out );
});
于 2012-05-24T18:57:47.117 回答
1

$.getJSON是异步的。这意味着out在 AJAX 调用完成之前返回。

您不能从 AJAX 调用返回任何内容,您需要将out回调中处理的所有代码添加到$.getJSON.

我建议将回调传递给您的函数。像这样的东西:

function getSearch(url, callback) {
    var out = '';
    $.getJSON(url, function(data) {
        for(var i = 0; i < numResults; i++) {
            out += '<p class="hash_list">' + '<a href="http://www.twitter.com/' + data.results[i].from_user + '">' + data.results[i].from_user + '</a>: ' + data.results[i].text + '</p>';
        }
        if(typeof callback === 'function'){
            callback(out); // call your callback with data
        }
    });
}

现在,您不再期待 的返回值getSearch,而是向它发送回调。

getSearch('http://example.com/myurl', function(data){
    // this function will get called sometime in the future,
    // once $.getJSON is done, "data" will be the "out" from the AJAX call
});
于 2012-05-24T18:57:42.183 回答