Javascript 如何将项添加到promise之外的数组中
这种怀疑与承诺有关。 我需要将子集合“bar”的文档添加到块外部初始化的数组中Javascript 如何将项添加到promise之外的数组中,javascript,firebase,foreach,promise,async-await,Javascript,Firebase,Foreach,Promise,Async Await,这种怀疑与承诺有关。 我需要将子集合“bar”的文档添加到块外部初始化的数组中 ... foo.bars = new Array<IBar>(); let manyBars = documentRef.collection('bar').listDocuments(); (await manyBars).forEach( barItem => { barItem.get().then(barDocument => { let bar: IBar
...
foo.bars = new Array<IBar>();
let manyBars = documentRef.collection('bar').listDocuments();
(await manyBars).forEach( barItem => {
barItem.get().then(barDocument => {
let bar: IBar = JSON.parse(JSON.stringify(barDocument.data()));
if (foo.bars !== null) {
foo.bars.push(bar);
console.log('in');
}
});
});
console.log('out');
。。。
foo.bar=新数组();
让manyBars=documentRef.collection('bar').listDocuments();
(等待多条消息)。forEach(barItem=>{
barItem.get().then(barDocument=>{
let bar:IBar=JSON.parse(JSON.stringify(barDocument.data());
如果(foo.bar!==null){
foo.bar.push(bar);
console.log('in');
}
});
});
console.log('out');
My console.log()先打印'out',然后打印'in'。我做错了什么?
forEach方法具有“wait”。您所做的错误主要是期望异步
。然后()
回调按同步时的行顺序完成。必须认识到,.then()
回调是在当前事件线程完成后执行的
虽然await
只是.then()
的一种语法选择,但它在很大程度上允许编写异步代码,就像编写同步代码一样
一般来说,在任何给定函数中,最好不要混合使用.then()
和wait
语法
假设barDocument.data()
是同步的,它应该像这样简单
...
try{
let manyBars = await documentRef.collection('bar').listDocuments();
let barDocuments = await Promise.all(manyBars.map(barItem => barItem.get()));
let foo.bars = barDocuments.map(barDocument => barDocument.data());
}
catch(error) {
console.log(error);
// handle error as necessary.
// return a value or re-throw the error.
}
如果
barDocument.data()
是异步的,那么您需要引入另一个等待承诺。所有(…)
get()
也是异步的,并返回承诺。您将无法在forEach循环中使用Wait。你需要另一种策略。看:谢谢你,我试过了。所有的(…)都很完美