2017-12-27 38 views
2

次のコードがあります。私は出力を期待:START、中東、中東、ENDNodeJs - 非同期/非同期/待機中

ではなく、私は、このSTARTを取得し、中東、END、中東

(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

内部awaitreturnステートメントに変更します。そうでない場合、prices.map()は、約束の代わりにundefinedのエントリの配列を生成しています。

Transport#save()は約束を返していないので、コールバックスタイルのAPIであるためPromiseコンストラクタでラップする必要があります。または、代わりに約束を返す方法について説明しているドキュメントを参照してください。

がそれをラップするには 、あなたはこのような何かを行うことができます:

// ... 
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() 'は約束を返しません。その場合、コールバックスタイルのAPIであるため、' Promise'コンストラクタでラップする必要があります。おそらく代わりに約束を返す方法を説明するかもしれない。 –

+0

そうです...約束を返せません。私はそれを約束で包み、今はうまくいく。ありがとう – Michalis