2017-09-06 141 views
1

我正在使用.map來映射出一個新對象並將舊價格添加到地圖。Promise {{0}}試圖等待.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沒問題:) –