コールバック関数内で新しい非同期呼び出しを行います
-
05-07-2019 - |
質問
Google AJAXフィードを使用したい複数のニュースフィードを取得してウェブページに表示するAPI 。
フィードのアイテムの表示方法を制御するため、GoogleのFeedControlクラスを使用できません。そのため、GoogleのFeedクラスが唯一の選択肢になります。
単一のフィードで動作するようにしました。URLとコールバック関数を提供します。コールバック関数内でフィードの結果を処理します。
私の質問:複数のフィードを取得するにはどうすればよいですか?どういうわけか、コールバック関数内に新しいgoogle.feeds.feedオブジェクトを作成し、新しいURLと...同じコールバック関数(?)を提供する必要があります
コンピューターサイエンスを勉強したことがないので、この種の再帰は頭を回転させます。 誰も私がしなければならないことを説明できますか?
解決
もちろん、あなたはそのようにすることができます、ここにいくつかの擬似コードがあります:
// 'feeds' is an array of the feed URLs
function grabFeeds(feeds) {
var index;
// We start with the first feed
index = 0;
// Kick off the process
feedWorker();
// Our "go get the next feed" function
function feedWorker() {
var feed;
// Do we have any more?
if (index < feeds.length) {
// Yes, request it and bump our index
// (You could combine these lines, but it's
// clearer to keep them separate)
feed = feeds[index];
++index;
start_feed_download(feed, callback);
}
}
// Our callback function
function callback() {
// ...do something with the result...
// Kick of the next feed (feedWorker is defensive,
// so we don't have to check index here)
feedWorker();
}
}
Google Feed APIがわからないため、プレースホルダー start_feed_download
関数。
それは、フィードの配列を受け入れる grabFeeds
関数を介してフィードを取得するプロセスを開始します。 grabFeeds
は、最初のフィードリクエストを開始する feedWorker
を開始し、すぐにを返します(ほぼ確実に最初のフィードが取得される前)。 callback
は結果を処理し、 feedWorker
に次のフィードリクエスト(ある場合)を開始するように要求します。
&quot;魔法&quot;ここでは、 feedWorker
と callback
は両方ともクロージャー。したがって、 grabFeeds
がすでに返されていても、 index
および feeds
変数は存続します。 (&quot; execution context&quot;と呼ばれるオブジェクト内で)実行コンテキスト内のものを参照する限り、この場合、 callback
と feedWorker
がnoになるまでGoogleのものでより長く参照される。
他のヒント
はい、大丈夫です。再帰を行うときは常に、(a)基本ケースと(b)再帰ケースの2つのケースがあることを確認してください。
2番目の場合のみ、関数自体が呼び出されます。ベースケースではないことを確認してください。そうしないと、無限の再帰が発生します。たとえば、この階乗関数では、0が基本ケースであり、それ以外はすべて再帰ケースです
function fact(n) {
if (n==0) { return 1; }
else { return n * factorial(n-1) }
}
別の方法として、一度に1つずつ実行することもできます。最初のものを開始してから2番目のものを開始します。2番目のものが完全にロードされるのを待ってから、2番目のものがロードを開始します。