2017-11-11 37 views
0

我試圖通過AJAX將GET請求的一部分結果存儲到字符串變量中時出現問題。將AJAX GET響應的一部分(以JSON形式)存儲到字符串變量中的問題

基本上,我想使它包含GET請求操作的某個函數將返回該操作的結果。

var count = 0; 

$.getJSON("https://api.icndb.com/jokes/count", function(data){ 
    count = data.value+1; 
    for (i = 1; i < count; i++){ 
     if (i != 1) { 
      setTimeout(jokeGet, i*7500, i); 
     } 
     else { 
      jokeGet(i); 
     } 
    } 
}); 

function jokeGet(n) { 
    var str = ""; 
    $.getJSON("https://api.icndb.com/jokes/" + n, function(data){ 
     if (data.type != "NoSuchQuoteException") { 
      $(".joke").html(data.value.joke); 
      str = data.value.joke; 
     } 
     else { 
      count++; 
     } 
    }); 

    return str; 
} 

API我正在發出請求以將信息存儲在JSON樹中。下面是這種樹的兩個例子:

{ "type": "success", "value": { "id": 1, "joke": "Chuck Norris uses ribbed condoms inside out, so he gets the pleasure.", "categories": ["explicit"] } } 

{ "type": "NoSuchQuoteException", "value": "No quote with id=8." } 

但是,每當我運行單元測試(通過QUnit),事實證明,在任何及所有情況下,jokeGet()函數返回一個空字符串。這是我覺得很奇怪的事情,因爲我認爲str = data.value.joke系列會讓它變成這樣,這個笑話被存儲在變量str中。

顯然,因爲str總是以空字符串的形式返回,所以情況並非如此。有什麼建議,爲什麼這是?

更新

考慮到的是什麼,我現在在做的目的不是爲了讓程序工作,但做單元測試,以證明程序工作,我已決定將「單元測試」文件:

QUnit.test("cn_jokes", function(assert) { 
    function joke(n, expected) { 
     assert.equal(jokeGet(n), expected); 
    } 
    joke(1, "Chuck Norris uses ribbed condoms inside out, so he gets the pleasure."); 
    joke(8, undefined); 
    joke(163, "Ninjas want to grow up to be just like Chuck Norris. But usually they grow up just to be killed by Chuck Norris."); 
    joke(221, "Chuck Norris is the only person to ever win a staring contest against Ray Charles and Stevie Wonder."); 
    joke(352, "Chuck Norris doesn't see dead people. He makes people dead."); 
    joke(502, "Chuck Norris insists on strongly-typed programming languages."); 
    joke(526, "No one has ever pair-programmed with Chuck Norris and lived to tell about it."); 
    joke(598, "Once Chuck Norris and Superman had a competition. The loser had to wear his underwear over his pants."); 
}); 

正如你可以看到,我想獲得的jokeGet()功能,具體,返回笑話值。請讓我知道這是否可能。

回答

2

$.getJSON是異步的前返回值;您的代碼將在請求發出時繼續運行。正因爲如此,str很久之前通過您傳遞給getJSON運行的回調返回。你或許應該有jokeGet需要一個回調函數,並調用它的請求完成(通過data.value.joke作爲參數)時:

function jokeGet(n, callback) { 
    $.getJSON("https://api.icndb.com/jokes/" + n, function(data){ 
     if (data.type != "NoSuchQuoteException") { 
      $(".joke").html(data.value.joke); 
      if (callback !== undefined && callback !== null) 
       callback(data.value.joke); 
     } 
     else { 
      count++; 
      if (callback !== undefined && callback !== null) 
       callback(undefined); // not sure if you want undefined or "" in this case 
     } 
    }); 
} 

編輯:您可以使用異步回調與QUnit。如上所述,只需使用assert.async()here

QUnit.test("cn_jokes", function(assert) { 
    var done = assert.async(); 
    var jokesDone = 0; 
    var numJokes = 8; // make sure to change this if you add more 
    function joke(n, expected) { 
     jokeGet(n, function(j) { 
      assert.equal(j, expected); 
      if (++jokesDone == numJokes) done(); 
     } 
    } 
    joke(1, "Chuck Norris uses ribbed condoms inside out, so he gets the pleasure."); 
    joke(8, undefined); 
    joke(163, "Ninjas want to grow up to be just like Chuck Norris. But usually they grow up just to be killed by Chuck Norris."); 
    joke(221, "Chuck Norris is the only person to ever win a staring contest against Ray Charles and Stevie Wonder."); 
    joke(352, "Chuck Norris doesn't see dead people. He makes people dead."); 
    joke(502, "Chuck Norris insists on strongly-typed programming languages."); 
    joke(526, "No one has ever pair-programmed with Chuck Norris and lived to tell about it."); 
    joke(598, "Once Chuck Norris and Superman had a competition. The loser had to wear his underwear over his pants."); 
}); 
+0

是否沒有辦法讓jokeGet()函數本身返回值? –

+0

@JMG不,不是真的。你可以讓'jokeGet'返回一個你用'data.value.joke'解決的'Promise',並用'await'在'async'函數中調用它。這可能會讓你的代碼看起來更加結構化,但對於像這樣簡單的東西來說,使用'await'看起來有點矯枉過正,IE並不支持它。 –

+0

@JMG剛剛注意到你的編輯。我會更新我的答案。 –

0

嘗試使用裏面的return語句,如果塊

if(condition){ 
return str; 
} else { 
return 
} 

我想這品行是由於JS的異步性質,GET請求完成

+0

無效。我猜是因爲jokeGet()裏面的函數(數據)。使用該策略,變量「str」被認爲是不屬於jokeGet()的變量,而是屬於與ajax調用相關的內部函數。 –

+0

嗯,你是對的,那麼你應該使用回調 –

相關問題