【问题标题】:Can I stop forEach until I get data from server with promise-then?我可以停止 forEach 直到我通过 promise-then 从服务器获取数据吗?
【发布时间】:2018-11-19 03:03:15
【问题描述】:

我正在尝试使用promise-then 从服务器获取 img url,并在服务器中使用该 img url 更新其他对象。

但是,我无法更新数据,因为在下载 url 之前触发更新数据的功能,所以它返回null

所以,我认为如果我可以停止运行 forEach 直到我得到 imgUrl,那么一切都会正常运行。

这是我的代码


store.service.ts

addStoreImgList(imgArr, storeName) {
  const menuUrls = this.getStoreMenuImgUrl(imgArr.imgList, storeName);
  const normalUrls = this.getStoreNormalImgUrl(imgArr.normalImgList, storeName);

  return {menuUrls, normalUrls};
}

getStoreMenuImgUrl(menuImg, storeName) {
  const menuUrls = [];
  menuImg.forEach(item => {
    const imgRef = this.storageRef.child(`store/menuImg/${storeName}/${item.name}`);
    imgRef.put(item).then((snapshot) => menuUrls.push(snapshot.downloadURL));
  }); // Can I stop menuImg.forEach until I get a data from server here?

  return menuUrls;
}

getStoreNormalImgUrl(normalImg, storeName) {
  const normalUrls = [];
  normalImg.forEach(item => {
    const imgRef = this.storageRef.child(`store/normalImg/${storeName}/${item.name}`);
    imgRef.put(item).then((snapshot) => normalUrls.push(snapshot.downloadURL));
  });

  return normalUrls;
}

edit-store.component.ts

const urls = this.storeService.addStoreImgList(imgArr, this.storeName);

如果您能提供更好的建议,我将不胜感激。 我实际上尝试在rxjs 中使用observable,但我不能。

谢谢!

【问题讨论】:

  • normalImg 是什么?那是一个 Observable 数组?
  • 不,是文件图片数组

标签: angular promise rxjs angular-promise


【解决方案1】:

使用“香草”承诺没有简单易行的方法来做到这一点。你可以做到,但它需要你建立一个 Promise 列表并将它们链接在一起。这种代码会很快变得非常丑陋和复杂。

执行此操作的最简单方法是利用 async await 语法。

您要查找的内容应如下所示:

async getStoreMenuImgUrl(menuImg, storeName) {
  const menuUrls = [];
  for (const item of menuImg) {
    const imgRef = this.storageRef.child(`store/menuImg/${storeName}/${item.name}`);
    const snapshot = await imgRef.put(item);
    menuUrls.push(snapshot.downloadURL);
  }

  return menuUrls;
}

【讨论】:

  • 感谢您的回复!我像您的代码一样尝试了它,但是却出现了这样的错误。 ERROR Error: Function DocumentReference.set() called with invalid data. Unsupported field value: a custom ZoneAwarePromise object (found in field menuPhotoList)
  • 调用函数addStoreImgList()需要做相应的修改。 menuUrlsmenuUrls 现在是 Promise,必须按原样处理,addStoreImgList() 也必须返回一个 Promise,它的调用者必须按原样处理 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多