2017-12-27 1028 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