Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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映射等待响应_Javascript_React Native_Asynchronous_Promise_Async Await - Fatal编程技术网

映射中的Javascript映射等待响应

映射中的Javascript映射等待响应,javascript,react-native,asynchronous,promise,async-await,Javascript,React Native,Asynchronous,Promise,Async Await,我有一系列问题。 每个问题都有一些答案,这些答案是一些要上传的文件。 一切进展顺利,而不是API调用没有等待Promise.all完成 以下是步骤: 通过问题数组映射,如果问题是imagetype,则获取所有文件并尝试上载它们 上传后,解析上传的所有承诺,并添加问题的答案Promise.all()的结果 完成所有问题的循环后,进行API调用以保存到DB中,DB现在不等待上载所有文件并解决该数组中的所有问题 导出函数sendReview(任务ID、公司ID、问题、导航){ 返回异步(调度)=

我有一系列问题。
每个问题都有一些答案,这些答案是一些要上传的文件。
一切进展顺利,而不是API调用没有等待Promise.all完成

以下是步骤:

  • 通过问题数组映射,如果问题是
    image
    type,则获取所有文件并尝试上载它们

  • 上传后,解析上传的所有承诺,并添加问题的答案
    Promise.all()的结果

  • 完成所有问题的循环后,进行API调用以保存到DB中,DB现在不等待上载所有文件并解决该数组中的所有问题

  • 导出函数sendReview(任务ID、公司ID、问题、导航){
    返回异步(调度)=>{
    分派(actions.sendReview.pending());
    试一试{
    让用户=等待getUser();
    user=JSON.parse(user);
    questions.map(异步问题=>{
    如果(question.type==='image'){
    让图像=问题。答案;
    如果(images.length>0){
    const results=images.map(异步映像=>{
    返回wait wait imageApi.upload(图像)。然后(res=>{
    返回res.url;
    });
    });
    问答=等待承诺。全部(结果)。然后(完成=>{
    返回已完成;
    });
    }
    }
    });
    常量数据=等待任务sapi.sendReview({
    任务id:taskId,
    公司id:companyId,
    user\u id:user.id,
    问题:JSON.stringify(问题)
    });
    如果(data.status==201){
    标记已完成(任务ID);
    导航。导航('MyTasks');
    分派(actions.sendReview.success({}));
    }
    否则{
    分派(actions.sendReview.error());
    }
    }捕捉(错误){
    分派(actions.sendReview.error(err));
    }
    };
    }
    
    下面是使用的函数


    如何确保
    .map()
    中的所有项都已准备就绪,并在调用API后立即执行?

    使用
    Promise.all
    在数组中等待承诺


    Promise.all(questions.map(…)

    给你一个我不久前编写的代码示例:

    await Promise.all((await readdir(repoPath, "utf8")).map(async file => {
      if (!/\.mjs$/.test(file)) return;
      const filePath = `${repoPath}/${file}`;
      log(`importing "${file}"`);
    
      const module = await import(filePath);
    
      const meta = {
        repository,
        file,
        filePath,
        description: module.description || {}
      };
    
      module.default((...args) => createModule(meta, ...args));
    }));
    
    如果您有异步映射处理程序,则需要记住,结果映射的内容包含承诺

    Promise.all()
    会帮你的

    在您的情况下,您需要做的只是更改:

    questions.map(async(question) => {
      if(question.type === 'image'){
        let images = question.answer;
        if(images.length > 0){
          const results = images.map(async (image) => {
            return await imageApi.upload(image).then(res => {
              return res.url;
            });
          });
          question.answer = await Promise.all(results).then((completed) => {
            return completed
          });
        }
      }
    });
    
    详情如下:

    await Promise.all(questions.map(async(question) => {
      if(question.type === 'image'){
        let images = question.answer;
        if(images.length > 0){
          const results = await Promise.all(images.map(async (image) => {
            return await imageApi.upload(image).then(res => {
              return res.url;
            });
          }));
          question.answer = results.then((completed) => {
            return completed
          });
        }
      }
    }));
    

    在Promise.all中包装.map(),以及其他一些小的更改使它起作用。我没有考虑它,因为我的.map()没有返回承诺数组,但在Promise.all()中包装.map()有帮助。弄明白这一点很痛苦。我花了相当长的时间进行调试。在内部循环中,您正在执行
    等待承诺。所有(结果)
    。在外环上,你什么也没做!你