我試圖通過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()
功能,具體,返回笑話值。請讓我知道這是否可能。
是否沒有辦法讓jokeGet()函數本身返回值? –
@JMG不,不是真的。你可以讓'jokeGet'返回一個你用'data.value.joke'解決的'Promise',並用'await'在'async'函數中調用它。這可能會讓你的代碼看起來更加結構化,但對於像這樣簡單的東西來說,使用'await'看起來有點矯枉過正,IE並不支持它。 –
@JMG剛剛注意到你的編輯。我會更新我的答案。 –