2017-12-29 21 views
1

ユーザーのループをループするループがありますが、このループは非同期です。すべてのユーザーが新しい文書を作成して保存し、保存するのを待っています次のユーザーに移動します。私は次のユーザーに移動するときに対処できるので、私の問題は新しい文書データを保存するときです。私はmongoose saveメソッドを使用しています。関数を続行する前に保存を待つ

主な機能は、ループを実行しています、ここではサンプルです。 注: '非同期' は非同期モジュールv2.6.0で

async.forEach(users, (user, callback)=>{ 
    console.log(`Checking ${user.first_name}`); 
    createNewDocument(user, (err)=>{ 
      if(!err) { 
       console.log("New document created."); 
       callback(); 
      } 
    }, (err)=>{ 
     if(!err){ 
      console.log("All users were updated"); 
     } 
    }); 
} 

非非同期メソッド

users.forEach((user)=>{ 
    console.log(`Checking ${user.first_name}`); 
    createNewDocument(user, (err)=>{ 
     if(!err) { 
       console.log("New document created."); 
      } 
    }); 
}); 

createNewDocument機能

function createNewDocument(user, callback) 
{ 
     console.log("Creating a new doc..."); 
     let doc = new Doc(); 
     doc.save((err)=>{ 
     if(!err){ 
      console.log(`New doc created for user ${user.first_name}`); 
      callback; 
     } 
     }); 
     console.log("Creating a new doc finished executing..."); 
} 

すべてを実行し、最後にされます私がログに記録するのは、すべてのユーザーのために「ユーザーのために作成された新しい文書....」の束です。 私は非常に多くのことをやってみましたが、doc.saveを約束してみましたが、うまくいきませんでした。

編集:次のユーザーに移動する前に新しい文書を作成することが重要です。これらの文書を呼び出し配列に追加して実行する必要はありません。以前の文書をチェックする必要がありますループが次回に入ったときに実際に存在し、そこからデータを取り出す

+0

:あなたは次の操作を行うことができます約束を使用

。では、なぜ非同期ループを使用していますか?非同期の全体が待たされることはありません。 – gforce301

+0

以前は非同期ループを使用していましたが、誰かが非同期を使用するように提案してから、asyncが待機しないようにするまで、同じ問題が発生し、コールバックによって制御されるとのことでした。 –

+0

"コールバック"は実際に非同期動作とは関係ありません。コールバックを使用する同期関数はたくさんあります。ネイティブ 'Array.forEach'は1つを使用します。 – gforce301

答えて

0

ネストされた非同期で適切なエラー処理のための約束がすでに何年もありました。最近では、約束をC#コードのように見せるためにasyncawaitの構文がありますが、その構文が約束を使用するため約束がどのように機能するかを知ることが重要です。 「私がやりたいことは、すべてのユーザーのために新しい文書を作成し、それを保存し、これを保存し、次のユーザーに移動するのを待つさ」

const createNewDocument = user => 
    new Promise(
    (resolve,reject) => { 
     console.log("Creating a new doc..."); 
     let doc = new Doc(); 
     doc.save(
     err=>{ 
      console.log("Creating a new doc finished executing..."); 
      err 
      ? reject(err) 
      : resolve(`New doc created for user ${user.first_name}`) 
     } 
    );  
    } 
); 

const saveDocuments = (users,processedSoFar=[]) => { 
    if(users.length===0){ 
    return processedSoFar; 
    } 
    console.log(`Checking ${users[0].first_name}`); 
    return createNewDocument(users[0]) 
    .then(
    result=>{ 
     console.log("New document created."); 
     processedSoFar.push(users[0]); 
     return saveDocuments(users.slice(1),processedSoFar);  
    } 
) 
    .catch(
    err=>Promise.reject([err,processedSoFar]) 
); 
} 

saveDocuments(users) 
.then(
    result=>{ 
    console.log("Processed the following users:",users); 
    } 
) 
.catch(
    ([err,processed])=>{ 
    console.log(
     "Something went wrong:",err, 
     "Processed so far:",processed 
    ) 
    } 
) 
関連する問題