我正在編寫一個程序,它接受一個句子,並用數據庫中的完整詞彙替換縮寫(例如,「你好,gm」 - >「你好,早上好」if存儲在數據庫中的縮寫是「hi」 - >「hello」和「gm」 - >「早上好」)。原始語句存儲在$('#translation')。text()中,並且應該相應地替換。以正確的順序執行承諾循環
因此,我發現如何使getFullSentence()等待for循環通過使用promise來爲每個單詞完成助手函數getFullWord()。
問題是getFullWord()沒有按順序執行,例如,如果我登錄「我」我得到0,3,1,2,而不是0,1,2,3。我該如何解決這個問題?先謝謝你!
function getFullSentence(uid, sentence) {
var promises = [];
var words = sentence.split(" ");
$.each(words, function(i, word) {
promises.push(getFullWord(uid, word, i));
});
$.when.apply(null, promises).done(function() {
play($('#translation').text());
});
}
function getFullWord(uid, word, i) {
var defer = $.Deferred();
$.get("/checkAbbreviation/" + uid + "/" + word, function(data) {
word = data.full;
var currSentence = $('#translation').text() + " ";
var newSentence = currSentence + word.toUpperCase();
$('#translation').text(newSentence);
}).done(function() {
defer.resolve();
});
return defer.promise();
}
'$ .Deferred()'是沒有必要的'getFullWord()'函數,'.done( )'返回一個jQuery承諾對象。 '我'不用'getFullWord'。你可以在問題中包含「play」文字嗎?爲什麼沒有從'getFullSentence'返回值?使用'.then()'鏈接到'$ .get()'而不是'$ .get()'callback和'.done()' – guest271314
感謝您的迴應! play()調用一個名爲ResponsiveVoice.js的庫來說出這個句子。 getFullSentence()不需要返回任何東西,因爲它只是調用play()函數 – sleepycow