Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将项添加到promise之外的数组中_Javascript_Firebase_Foreach_Promise_Async Await - Fatal编程技术网

Javascript 如何将项添加到promise之外的数组中

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

这种怀疑与承诺有关。 我需要将子集合“bar”的文档添加到块外部初始化的数组中

...
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。你需要另一种策略。看:谢谢你,我试过了。所有的(…)都很完美