2017-09-06 9 views
1

私は.mapを使用して新しいオブジェクトをマップし、古い価格を地図に追加します。私は非同期/ここに、私のデータマップで待つを使用しています約束{<pending>} - .mapを待ちます。

は私のコードは次のようになります。

let datasets = await changes.map(async (data) => { 
    let products = {}; 
    let last = await models.prices.findOne({ 
    where: { 
     productId: data.productId, 
     sourceId: data.sourceId 
    }, 
    order: [['createdAt', 'DESC']], 
    limit: 1, 
    offset: 1 
    }); 

    products.name = data.product.name; 
    products.price = data.price; 
    products.sku = data.product.sku; 
    products.source = data.source.name; 
    products.link = data.link; 
    products.diff = last.price; 


    return products; 
}); 

changesは、過去24時間で見られる価格の変化のすべてです。

lastには、特定の製品の価格が変更された前の時刻が含まれています。

return productsは待機していないので、Promise { <pending> }という迷惑メールが届きます。私がconsole.log(last)を使用している場合、内部で動作していますが、リターンを遅くする正しい方法を理解できません。

products.diff = last.priceは、これを有効にするために必要なものです。何か案は?

答えて

3

await約束を待っていますが、Array.prototype.mapは新しい約束を返します。あなたはそれをラップする必要がありますPromise.all

let datasets = await Promise.all(changes.map(async (data) => { 
    let products = {}; 
    let last = await models.prices.findOne({ 
    where: { 
     productId: data.productId, 
     sourceId: data.sourceId 
    }, 
    order: [['createdAt', 'DESC']], 
    limit: 1, 
    offset: 1 
    }); 

    products.name = data.product.name; 
    products.price = data.price; 
    products.sku = data.product.sku; 
    products.source = data.source.name; 
    products.link = data.link; 
    products.diff = last.price; 


    return products; 
})); 
+0

もちろん!ありがとう、完璧に動作します。私は待っている時間を持っている、私は答えられた質問としてあなたを入れます。 –

+1

@MilesCollier問題ありません:) –

関連する問題