2016-08-14 8 views
1

私はアイテムの配列を処理しようとしており、ブロック内で非同期関数を使用する必要があります。外側のループをasyncという関数にする必要があるので、ループ内でawaitを使用することができます。mapとforEachでawaitを使用するにはどうすればよいですか?

しかし、私は継続する前にループ '待っている'ように見えることはできません。 以下のコードは、としてmsgsを出力し、ループを実行します。

// with a foreach 
     let msgs = []; 
     items.forEach(function(item, index) { 
     item.laws.forEach(async function(law) { 
      let orig = await Laws.coll.findOne({url: law.cname}); 
      let title = Laws.title(orig); 
      let msg = `<${law.cname}|${title}>`; 
      msgs.push(msg); 
      debug("title", title, msg); 
     }); 
     }); 

     debug("msgs", msgs); // => shows [] 

と私はまた、私が試したmap

items.map(await async function(item) { 
    item.laws.map(await async function(law) { 
     let orig = await Laws.coll.findOne({url: law.cname}); 
     let title = Laws.title(orig); 
     let msg = `<${law.cname}|${title}>`; 
     msgs.push(msg); 
     debug("title", title, msg); 
    }); 
    }); 

FWIWで様々な構文を試してみました:

await item.laws.map(async function() ... 
//and 
item.laws.map(await async function() ... 

を成功せず。

どちらの場合も、ループはの後に実行され、の後にdebug("msgs", msgs)が印刷されます。

答えて

1

問題を解決するには2通りの方法があります。

  1. 使用Javascript Promisesで説明したように代わりfor(let of items){...}
  2. 約束シーケンスは - >は

理由は、両方のマップである配列を作成し、forEachのは、提供コールバックを呼び出しますが、それを実行するのを待ちません。 。

+0

ありがとうございます!私は今、別のツールを使用して待つ:) – dcsan

関連する問題