2017-05-24 11 views
0

この流星コードは、コレクションからドキュメントをn秒に1回印刷する必要があります。どのように動かすのですか? THX時間間隔にカーソルをあててください

 myCol.find({abc: undefined}).forEach(
     function (doc) { 
      setTimeout(function (doc) { 
       console.log(JSON.stringify(doc)); 
      }, 1000) 
     } 
    ) 

2の問題:ドキュメントが定義されていないと、タイマーが起動されていない、ので、それだけですべてを一度に発射します。

+0

手の込んだよ「DOCは定義されていませんfindメソッドのドキュメントまたはfor eachを使用してこれを解決する必要があります。私は、APIの用語でfindまたはforEachが何をするかについて全く知らない。しかし、タイムアウトについては、ここが問題です。非同期イベントがJSでどのように機能するか知っていますか?彼らはスタックに追加されているので、約1000ミリ秒で1回実行されます。実行をコード化してから1000ミリ秒待っているため、1000ミリ秒待たずにすぐに1つずつ起動します。最初の発生時にのみタイマー機能を設定し、その中に後続のタイマーを設定する必要があります – user907860

+0

タイマーの問題解決策に関して、コードで例を挙げることはできますか? –

答えて

1

例ではなく、JSのイベントモデルの本質的な理解が必要です。 JSは単一のスレッド言語であり、setTimeoutsetInterval、​​経由でassync関数を追加すると、スタックに追加されます。そして、条件が満たされた場合、エンジンは、現在のスレッドが終了した後に関数を1つずつ起動します。

この例では、forEach関数ですべての要素に対して呼び出されるannon関数を追加しています。

したがって、コレクションは、単一スレッドでを横切っています。このスレッドでは、annon関数はタイムアウト関数を追加していますが、immediatellyと呼ばれることはありません。それらはスタックに追加されます。そして、このスタックの関数は、現在のスレッド(この場合はコレクションを通るあなたのトラバーサル)の実行が終了するまで呼び出されません。

現在のスレッドが終了すると、JSエンジンはスタックから関数を取得し、現在の関数の条件がスタックに追加されてから1000msのように満たされているかどうかをチェックします。追加されたすべてのタイムアウトコールバックのために条件が満たされていたので(最初のコールバックのために渡された場合は1000ms、その後のコールバックについては確実に成功した)彼らは一人ずつ解雇されます。あなたは一度にあなたを見ます。

例は次のようになります。

var i = 0; 
function traverseInLoop() { 
    console.log(JSON.stringify(myCol[i])); 
    if (myCol(++i) { 
    setTimeout(traverseInLoop, 1000) 
    } 
} 
setTimeout(traverseInLoop, 1000); 

またはそのような何かを、あなたのアイデアを取得する必要がありますが、あなたは、その後、私に教えていない場合、私は

関連する問題