2010-12-27 10 views
0

これをサイクル同期にするにはどうすればいいですか?前もって感謝します。サイクル同期化の方法は?

コード

// (...) 

object = { 
    'item1': 'apple', 
    'item2': 'orange' 
}; 

// (...) 

for(var key in object) { 

    // do something async... 
    request.on('response', function (response) { 
    response.on('data', function (chunk) { 

     console.log('The message was sent.'); 

    }); 
    }); 

} 

console.log('The for cycle ended.'); 

出力

The for cycle ended. 
The message was sent. 

私はこのタイプの出力を見たいのですが...

The message was sent. 
The for cycle ended. 
+3

ようこそStackOverflow!合理的な方法で回答を得るためには、質問の詳細をもっと詳しく記述する必要があります。実際には、今のように、あなたの質問はコミュニティによって「本当の質問ではない」として閉鎖されるかもしれません。それを気にさせてはいけません。もう少し詳しくお試しください。人**は準備ができていて、助けてくれるでしょう。おそらく、[FAQ](http://stackoverflow.com/faq)と[このページの質問方法](http://stackoverflow.com/questions/how-to-ask)を読む価値があります。最高、 –

+0

ありがとう、T.J.クラウダー。 –

+0

Milo、もう一度質問を再投稿するのではなく、質問を「編集」して詳細情報を提供することができます – Matt

答えて

5

答えが

sendMessageへの呼び出しは同期式なので、非同期の機能を呼び出す必要があります(下記参照)。 sendMessageはNodeJSドキュメントには表示されません。サイクル同期している :


オリジナル答え

var obj, keys, key, index; 

// Define the object 
obj = { 
    'item1': 'apple', 
    'item2': 'orange' 
}; 

// Find its keys (you can just type in the array if they don't 
// need to be discovered dynamically) 
keys = []; 
for (key in obj) { 
    keys.push(key); 
} 

// Start the loop 
index = 0; 
process(); 

// This function gets called on each loop 
function process() { 
    // Are we done? 
    if (index >= keys.length) { 
     // Yes 
     console.log("The cycle ended"); 
    } 
    else { 
     // No, send the next message and then 
     // use this function as the callback so 
     // we send the next (or flag that we're done) 
     sendMessage(obj[keys[index++]], process); 
    } 
} 
:あなたはそれはあなたからそれを得たということでしたどんなソースからの同期バージョンを見つける必要があり、またはそのコールバックメカニズムを使用します。あなたは setTimeoutのような何かをしなければならないでしょうか何か* *同期にする何かをする必要があります。

NodeJSに行っている呼び出しは、同期していない可能性があります。同期呼び出しが必要な場合は、xyzSyncバージョンのものに電話する必要があります。

継続あなたがループを作りたいと思った場合、あなたが意味するかもしれないものを推測する* 同期*

var obj, key; 

// Define the object 
obj = { 
    'item1': 'apple', 
    'item2': 'orange' 
}; 

for (key in obj) { 
    schedule(key); 
} 

function schedule(k) { 
    setTimeout(function() { 
     // Do something with obj[k] 
    }, 0); 
} 
+0

私は自分の質問を編集しました、それはより明確ですか? –

+0

@Milo:はい、回答を更新しました。 –

+0

@Milo:申し訳ありませんが、更新されたコードで2つの問題点があります。一定。 –

0

私はNode.jsのに慣れていないが、私はそれを推測します:

function() { 
    console.log('The message was sent.'); 
} 

は、メッセージが正常に送信されると呼び出されるコールバック関数です。そして、メッセージの実際の送信は非同期であり、残りの実行をブロックしないようにします。これをブロッキング/同期プロセスにしたい場合は、次のようにすることができます(node.jsで同期呼び出しを行う明示的な方法があるかもしれませんが、あまり慣れていません)。

for(var key in object) { 
    var completed = false; 
    sendMessage('Hello!', function() { 
    console.log('The message was sent.'); 
    completed = true; 
    }); 

    while(completed == false) { 
    ; // do nothing 
    } 
} 

上記のアプローチの欠点は、これまでのsendMessageにエラー()またはコールバックがある場合、あなたはしばらく()ステートメントの無限ループに自分自身を見つけることができます。これは、無限の同じ問題を抱えているだろう

var count = 0; 
for(var key in object) { 
    count++; 
    sendMessage('Hello!', function() { 
    console.log('The message was sent.'); 
    count--; 
    }); 
} 

while(count > 0){ 
    ; // wait until all have finished 
} 

:あなたが非同期的にすべてのメッセージを送信することができますが、その後に移動する前に、すべて完全に彼らのために待機していました

別のアプローチは、このような何かをするだろうカウントが0に再び達するのを防ぐエラーがあった場合はループします。

関連する問題