2017-12-27 1448 views
2

我有以下代碼。我期望的輸出:開始,中間,中間,結束NodeJs - 異步/待機異步/等待

,而是我得到這個開始,中間,結尾,中間

(FYI價格陣列在我的例子中2個值)

console.log("START"); 
await Promise.all(prices.map(async(price) => { 
    let obj: any = {};  
    obj.normal = price.normal; 

    await new Transport(obj).save(async (err: any, doc: any) => { 
    console.log("Middle"); 
    price.transport_id = doc._id; 
    }); 
})); 

console.log("END"); 
console.log(prices); 

回答

3

將內部await更改爲return語句,否則prices.map()正在生成undefined而不是承諾的條目數組。

因爲Transport#save()沒有返回承諾,所以您需要用Promise構造函數來包裝它,因爲它是一個回調式API,或者參考可能解釋如何返回承諾的文檔。

把它包起來,你可以做這樣的事情:

// ... 
obj.normal = price.normal; 

return new Promise((resolve, reject) => { 
    new Transport(obj).save((err: any, doc: any) => { 
    console.log('Middle'); 

    if (err) return reject(err); 

    price.transport_id = doc._id; 
    resolve(price); 
    }); 
}); 
+0

仍然是相同的輸出....我改,你說「等待新的交通運輸(OBJ)」到「迴歸新的交通運輸(OBJ) 「 – Michalis

+0

在我看來,'Transport#save()'不會返回承諾,在這種情況下,您需要用'Promise'構造函數來包裝它,因爲它是一個回調式API,或者參考文檔這也許可以解釋如何返回一個承諾。 –

+0

這是正確的...它沒有回報承諾。我用承諾包裝它,現在很好。謝謝 – Michalis