2017-04-18 12 views
1

これは愚かな質問かもしれませんが、とにかく私は質問しています。私はコールバックを待つことについて質問があります。javascriptの要素の読み込みを待っています

私はWeb開発プロジェクトでPolymerを使用しています。私のページのいずれかで、私はループ内の要素をロードループを持っている:

loop 
    "element-a" 
end loop 

私はのデータベースとコンテンツからデータをフェッチしています「要素」データベースクエリの結果から移入されます。 "element-a"が一度ロードされると、別の "element-a"だけをロードしたいだけです。

今、私は強制的に次のような遅延を使用しています: sleepStupidly(usec); function sleepStupidly(usec) { var endtime = new Date()。getTime()+ usec; while(new Date()。getTime()< endtime); }

しかし、私はこれを行うより良い方法が必要です。どんな提案も参考になります。

+0

"sleepStupidly"の代わりに、単にwindow.setTimeoutを使用できます。しかし、それはあなたのデータは非同期的にフェッチされていることは、あなたの基本的な問題は、修正されませんので、それが利用可能になるとき、あなたは正確に知ることができません。データを取得するコードを投稿してください。 –

+1

私は、ポリマーを使用していないが、これはjavascriptの約束のための仕事のように聞こえる - やAjaxの成功。 – sheriffderek

+0

https://developers.google.com/web/fundamentals/getting-started/primers/promises#promisifying_xmlhttprequest – sheriffderek

答えて

0

sheriffderekは、約束やjQueryの$ .ajax()。success()メソッドがおそらくこれを行うための最良のツールだと指摘しています。さらに、良いol '再帰も同様に使用できます。以下は、あなたのケースでPolymer(v1)コンポーネント内でこれらを使用する方法の例です。

<dom-module id="example-component"> 
    <template></template> 
    <script> 
     Polymer({ 
      is:"example-component", 
      properties: { 
       //... 
      }, 
      fetchIndex: 0, 
      idsToFetch: [1, 2, 3, 4], 
      elementData: [], 
      ready: function() { 
       this.loadElement(this.idsToFetch[this.fetchIndex]); 
      }, 
      loadElement: function(idToFetch) { 
       var self = this;  // Create a reference for the ".done()" method to use when it fires 
       $.ajax({ 
        url: "http://example.com/getdata", 
        data: {"idToFetch": idToFetch} 
       }).done(function (data) {   // This will fire after the response is received, which is where you call the next 
        self.elementData.push(data); // Save the response data 
        self.fetchIndex++;          // Move to the next element 
        if (self.fetchIndex < self.idsToFetch.length) {   // If there's more to fetch 
         self.loadElement(self.idsToFetch[self.fetchIndex]); // Recursively call the same method 
        } 
       }).always(function(data){         // Optional 
        console.log("Fetch complete for ID: " + idToFetch); 
       }).error(function (error){         // Optional 
        console.log(error) 
       }); 
      } 
     }) 
    </script> 
</dom-module> 

要約すると、ポリマーのready()ハンドラにloadElement()メソッドを呼び出し、それをフェッチ開始するための最初の要素を提供します。 loadElement()の中では、渡された要素IDのデータを取得するためにフェッチします。フェッチ(.success()に似オーバー好ましいが、).done()したら、再帰的に再loadElement()メソッドを呼び出し、それをリスト内の次の要素を提供します。これは、fetchIndexの値がidsToFetchアレイの長さに等しくなるまで再帰的に続きます。

関連する問題