2017-06-23 7 views
-1
for(var i = 0 ; i < objects.length ; i++){ 

if(type == "user") 
{ // normal mathematical calculations 
    // result.push(objects[i]) 
} 
else if(type == "group"){ 
// Here i need a query "group" model 
    // find group related stuffs 
// and then push to result 
// result.push(objects[i]) 
    } 

} 

グループがオブジェクトの[i]をグループ化するときに、定義されていないことを示しています。グループのオブジェクト[i]を確認する必要があります。 ユーザブロックブロックを完全に同期化する方法をmongooseクエリで構成しますか?

+0

をサポートするブラウザで正しく動作します。あなたは本質的に非同期同期であるものを作ることはできません。あなたはそれを待たなければなりません、そして、それが終わったらあなたがする必要がある何でもしなければなりません。 –

+1

Javascriptでは、非同期操作を同期操作にすることはできません。あなたはできません。代わりに、非同期にプログラムする方法を学ぶ必要があります。コードを非同期補完にネストするか、約束と連鎖操作を使用することができます。理論的な質問だけでなく、実際のコードを表示してこれを実際のコーディングの問題にすると、もっと具体的にお手伝いできます。 Stackoverflowは実際のコードでよりうまく機能し、問題を解決する実際のコードを表示できます。私たちは、いくつかの段落で一般的な話題を教えようとするのにうってつけではありません。 – jfriend00

+1

また、 'for'ループ内で非同期操作を行うと、ループが非同期操作が完了するのを「待機」しないため、問題が発生する可能性があります。繰り返しますが、達成しようとしているものの全体的な実際のコーディングコンテキストを表示している場合は、実際に動作させるコードを表示できます。 – jfriend00

答えて

0

このブロックを同期させることはできますが、非同期機能の内部でのみ行うことができます。 async/awaitとthats allを使用する必要があります。

async function syncBlock(objects) { 
 
\t const result = []; 
 
\t for (var i = 0; i < objects.length; i++) { 
 
\t \t const type = objects[i].type; 
 
\t \t if (type === "user") { 
 
\t \t \t result.push(objects[i]) 
 
\t \t } else if (type === "group") { 
 
\t \t \t // Now loop will "wait" for result from find 
 
\t \t \t const res = await find(objects[i]); 
 
\t \t \t result.push(res) 
 
\t \t } 
 
\t } 
 
\t return result; 
 
} 
 
async function find(o) { 
 
\t return new Promise((resolve) => { 
 
\t \t setTimeout(() => { 
 
\t \t \t resolve(o); 
 
\t \t }, 100); 
 
\t }); 
 
} 
 
syncBlock([ 
 
\t {type : 'group'}, 
 
\t {type : 'user'}, 
 
\t {type : 'group'}, 
 
\t {type : 'user'}, 
 
\t {type : 'group'} 
 
]).then((res) => { 
 
\t console.log(res); 
 
}).catch((err) => { 
 
\t console.error(err); 
 
});

この例では、Node.jsの8+と "コールバック" と "約束は" のためにある何がasync/await

関連する問題