我正在使用Google的Feed API構建一種RSS Feed閱讀器。經過多次試驗和錯誤,我已經能夠通過PHP實例化一個給定RSS URL的連接,並返回JSON對象。我遇到的問題是,我試圖驗證數組中的多個URL,但由於AJAX的異步特性以及通過Google API加載時間延遲,結果代碼在驗證完成之前觸發。我嘗試過這樣的事情:強制同步,setTimeouts,對調用驗證的對象進行promise等,但我沒有收到任何地方。任何幫助都將非常感激。導致問題的異步網址驗證
我的代碼:
PHP
$feed = $_POST['feed'];
$url = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=&q=" . $feed;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, www.mywebsiteurl.com);
$body = curl_exec($ch);
curl_close($ch);
echo $body;
這個片段成功創建與給定提要URL的連接,並返回一個包含飼料數據的JSON對象。我打電話跟以下AJAX調用這個外部PHP腳本:
AJAX:
var conn = $.ajax({
url : "php/feedlog.php",
type : "post",
data : {feed: feed_a[i]}
});
conn.done(function (data){
var err = eval('(' + data + ')').responseStatus;
if (err==200){
console.log("Success");
} else if (err==400){
console.log("Failure with: " + err);
}
});
此代碼完美的作品單個連接的嘗試,但我需要通過飼料的陣列,以線性步驟,測試反饋,等待連接結果,然後繼續處理數組中的下一個數據源,或者斷開連接成功。
我試圖給feed_a []使用$ .each語句,但是循環觸發的速度比結果可以返回的快。我想我需要操作一個緩衝區,但我不知道如何實現它。
一如既往,如有需要,我可以根據要求提供額外的代碼,以前的嘗試或更好的說明。如果需要,我可以在我的網站上直播代碼以進行演示。
更直接的問題:如何強制循環($ .each,for循環或遞歸函數)等待來自AJAX調用的結果?
另外,爲了讓我的問題在將來更好,有人可以解釋爲什麼我的問題可能被標記了嗎?
編輯:感謝大家的快速反應!下面的代碼似乎解決我的問題:
$.each(v_feed, function(_,url){
$.ajax("php/feedlog.php",{
type: "POST",
data: { feed: url }
}).done(function(data){
var err = eval('(' + data + ')').responseStatus;
if (err == 200){
console.log("success with: " + data);
} else if (err == 400){
console.log("fail with: " + data);
console.log("removing from valid array");
v_feed.splice(v_feed.length - _, 1);
}
//console.log(err);
}).fail(function(){
console.log("Fail");
}).complete(function(){
console.log(v_feed);
});
});
「如何強制循環($ .each,for循環或遞歸函數)等待來自AJAX調用的結果?」你不這樣做。您可以使用相對回調/方法來請求並根據此設置邏輯。你可以將一個延遲/承諾對象數組傳遞給'$ .when':'$ .when.apply($,arrayOfPromises);' –
@Wolff能夠提供一個基本的例子或者一個網站嗎?恐怕我不完全理解你的相對回調/方法的含義。 – Vaune