Javascript 如何解决区域感知承诺问题?
如何防止区域意识的承诺 以下代码正在返回Javascript 如何解决区域感知承诺问题?,javascript,angular,Javascript,Angular,如何防止区域意识的承诺 以下代码正在返回ZoneAwarePromise const versions = await itemDetails.imageSamples.map(({ item, images }) => { const mapped = Promise.all( images.map((image) => this.pushImage(image, `items/${id}/images/`)
ZoneAwarePromise
const versions = await itemDetails.imageSamples.map(({ item, images }) => {
const mapped = Promise.all(
images.map((image) =>
this.pushImage(image, `items/${id}/images/`)
)
);
return { item, images };
});
// here I'm mapping twice. & I suspect this double mapping is causing the Zone Aware Promise
// I tried this way also:
const versions = await Promise.all( itemDetails.imageSamples.map(({ item, images }) => {
const mapped = Promise.all( ---> // this inside mapping is causing zone aware promise
images.map((image) =>
this.pushImage(image, `items/${id}/images/`)
)
);
return { item, images };
}));
以下代码正确返回承诺(即没有任何区域感知承诺)
这是推送映像异步函数
async pushImage(image, basePath) {
const imgId = this.angularDatabase.createPushId();
const route = `${basePath}${imgId}`;
const imageRef = this.angularFireStorage.ref(route);
return await concat(
imageRef.put(image.image).snapshotChanges().pipe(ignoreElements()),
defer(() => imageRef.getDownloadURL())
)
.pipe(
map(
(url) => (
{ ...image, url }
)
)
)
.toPromise();
}
所以两次映射似乎产生了问题
const promises = Promise.all(
itemDetails.promises.map(({ details, images }) => ({
details,
images: Promise.all(
images.map((image) =>
this.pushImage(image, `items/${id}/images/`)
)
),
}))
);
有人能提出解决办法吗
更新
const promises = Promise.all(
itemDetails.promises.map(({ details, images }) => ({
details,
images: Promise.all(
images.map((image) =>
this.pushImage(image, `items/${id}/images/`)
)
),
}))
);
如果要映射两次,还需要
Promise.all
两次。(除非你想把承诺的范围缩小)是的。我也试过那样做。仍然得到区域意识的承诺里面!!你说的“里面”是什么意思?谢谢你更新代码。它显示您实际上并没有在任何地方使用映射的promise,尤其是您没有等待它。您可以看到这个const-mapped=promise.all(images.map((image)=>this.pushImage(image,`items/${id}/images/`))代码>正在导致区域感知承诺。。。外部承诺正在正确返回。const promises=promise.all(itemDetails.promises.map({details,images})=>({details,images:promise.all(images.map((image)=>this.pushImage(image,`items/${id}/images/`)),})代码>