承诺解决方案尚不清楚的问题

时间:2019-11-19 23:07:52

标签: javascript reactjs promise async-await

我正在实现一项功能,可以选择和下载多个文档。

首先,我构建一个对象数组,其中包含每个选定文档的名称以及指向其位置的链接。

    getAllSelectedUrls = () => {
      const { selectedFiles } = this.state;

      const urls = [];
      selectedFiles.forEach((file) => {
        this.returnFileUrl(file.id).then(res => res.json()).then((data) => {
          urls.push({ fileName: file.name, url: data.content_path });
        });
      });
      return urls;
    }

returnFileUrl()是一个异步API调用,用于通过ID获取文件的链接:

returnFileUrl = async (fileId) => {
      try {
        const resp = await fetch(`/file?fileId=${fileId}`);
        return resp;
      } catch (err) {
        console.log(err);
      }
    }

我认为,通过更新urls方法内的.then数组,我可以确保每个url都将在返回时得到解析。

当我调用getAllSelectedUrls()时,可以在控制台中记录所有已填充数据的阵列。但是,我无法对其进行迭代或按索引访问任何对象,大概是因为此时尚未解析数据。

3 个答案:

答案 0 :(得分:2)

使用Promise.all()

getAllSelectedUrls = () => {
      const { selectedFiles } = this.state;
      return Promise.all(selectedFiles.map(file => {
        return this.returnFileUrl(file.id)
               .then(res => res.json())
               .then(data => ({ fileName: file.name, url: data.content_path }))
      }))
      .then(urls => {

       //do whatever you need to do with the urls array

      })
      .catch(e => console.log(e))
    }

答案 1 :(得分:0)

与@Bergi达成协议,width不会等到异步调用完成。它立即返回一个空数组。 但是,您可以使用所有解析方法来检查NSTableColumn数组是否已完全填充。如果是这样-使用例如将变量存储在某个地方transform.position = Vector3.Slerp(transform.position, pos, (chargeTimer/maxCharge));

或者只是将return数组移到状态中,并通过每次解析就将urls推入状态。

setState

答案 2 :(得分:0)

尝试一下:

(已编辑)

    getAllSelectedUrls = async () => {
      const { selectedFiles } = this.state;

      const urls = [];

      for (let i = 0; i < selectedFiles.length; i++) {
          const file = selectedFiles[i];
          res = await this.returnFileUrl(file.id);
          data = await res.json();
          urls.push({ fileName: file.name, url: data.content_path });
      }

      return urls;
    }

像这样,该函数将在所有promise都被解析并推入URL后返回