我是Nodejs的新手.在这里,我在Asmat中调用多个api调用.但我想在所有通话结束后回复promise .

function getChunkBatchDetailsResponse$(id,
  baseUri,
) {
  return new Promise((resolve) => {
   
    var options = {
      'method': 'POST',
      'url': `${configJSON.apigeeBaseUrl}/batch`,
      'headers': {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${userToken}`,
      },
      body:

    };
    request(options, function (error, response) {     
     
      if (response.body) {     

        for (let i = 0; i < totalNumberOfChunks; i++) {
        
          chunksArray.push(formData.buffer.subarray(chunkStart, chunkEnd));
          chunkStart = chunkEnd;
          chunkEnd = chunkStart + chunkSize;
          if (chunkEnd > totalFileSize) {
            chunkEnd = totalFileSize;
          }
        }
        let promiseAll = [];
        for (let i = 0; i < chunksArray.length; i++) {
          let chunkNumber = i + 1;

          //return new Promise((resolve) => {
          getChunkUploadResponse$(          ).then((response) => {
           
            logMessage(
              `Upload '${id}' took ${endUploadTime - startTime}ms to complete`,
            );

          });
          // resolve('chunk file uploaded');
          //});
        }
        // Promise.all(promiseAll);
      }

      resolve(batchMessage);
    });
  });

}


function getChunkUploadResponse$(
 
) {

  return new Promise((resolve) => {
   
    request.post(
      `${configJSON.apigeeBaseUrl}/UploadChunk`,
      {
        formData: {
          file: {
            value: buffer,
            options: {
              filename: directory.name + '.zip',
            },
          },
        },
        headers: {        
          Authorization: `Bearer ${userToken}`,
        },
      },
      (err, response) => {
        logMessage('err performing batch chunk upload.');
        logMessage(JSON.stringify(err));
        logMessage('response performing batch chunk upload');
        logMessage(JSON.stringify(response));

        if (err) {

          resolve({
            id,
            directory: directory.path,
            message: err,
            code: 500,
          });
        } else if (response) {
          const statusCode = response.statusCode;
          this.batchMessage = {
            id,
            directory: directory.path,
            message: response.statusMessage,
            code: statusCode,
          };
          if (statusCode === 201) {
            try {
              this.batchMessage.batch = JSON.parse(response.body);
              logMessage('Successfully performed a batch chunk upload');
              resolve(batchMessage);
            } catch { }
          } else if (statusCode === 413) {
            resolve({
              id,
              directory: directory.path,
              message: JSON.parse(response.body),
              code: 500,
            });

          }
          else {
            let message = '';
            try {
              message = JSON.parse(response.body);
            } catch {
              message = '';
            }
            batchMessage.message = message;
            logMessage('message performing batch chunk upload.');
            logMessage(message);
          }
          resolve(batchMessage);
        }
      },
    );
  });
}

如果所有呼叫均成功,则应返回成功.如果一次调用也失败,则应返回错误.

推荐答案

您可以使用Promise.all来等待所有Promise解决.

function getChunkBatchDetailsResponse$(id, baseUri) {
  return new Promise((resolve, reject) => {
    var options = {
      'method': 'POST',
      'url': `${configJSON.apigeeBaseUrl}/batch`,
      'headers': {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${userToken}`,
      },
      body: // Add your request body here
    };
    request(options, function (error, response) {     
      if (error) {
        reject(error); // Reject if there's an error
        return;
      }
      if (!response || !response.body) {
        reject(new Error('No response or empty body')); // Reject if no response or empty body
        return;
      }
      
      const chunksArray = [];
      const totalNumberOfChunks = /* calculate totalNumberOfChunks */;
      const chunkSize = /* calculate chunkSize */;
      let chunkStart = 0;
      let chunkEnd = chunkSize;
      const totalFileSize = /* calculate totalFileSize */;
      
  
      for (let i = 0; i < totalNumberOfChunks; i++) {
        chunksArray.push(formData.buffer.subarray(chunkStart, chunkEnd));
        chunkStart = chunkEnd;
        chunkEnd = chunkStart + chunkSize;
        if (chunkEnd > totalFileSize) {
          chunkEnd = totalFileSize;
        }
      }
      
      const promiseAll = chunksArray.map(chunk => {
        return getChunkUploadResponse$(chunk); // Call getChunkUploadResponse$ for each chunk
      });

      // Wait for all promises to resolve
      Promise.all(promiseAll)
        .then(() => {
          resolve(batchMessage); // Resolve with batchMessage once all uploads are successful
        })
        .catch(error => {
          reject(error); // Reject if any upload fails
        });
    });
  });
}

希望我正确理解了你的问题,这有帮助.祝你好运!:)

Node.js相关问答推荐

使用HTTPS从NodeJS 17.9.1升级到18.0.0后,SignalR连接失败

@nuxtjs/站点 map 错误提示:找不到包';NitroPack';

NPM:一般的npm二进制依赖可以静态构建吗?

如何在MongoDB中更新嵌套数组

如何在Reaction应用程序中查看存储的斑点图像?

编写动态创建的 YAML - 为生态系统创建 Docker compose 文件(使用 js-yaml)

如何在 Docker 容器中 SSO 登录 AWS(使用 aws-sdk v3)

为什么当我使用waitForSelector时 Puppeteer 导致我的测试套件挂起 30 秒,即使我在页面和浏览器上调用关闭?

为什么要加密 CSRF 令牌?

在 Node JS 中使用 url 链接而不是文件路径

将 express js app.use() 移动到另一个文件

如何解决这个关于 TaskRunner 的 Node/Express 代码问题?

try 运行迁移时的 Typeorm:缺少必需的参数:dataSource

AWS Kinesis 中的分区键是什么?

从 Node.js 应用程序查询 Heroku 托管的 Postgres 数据库时出现自签名证书错误

Sequelize 基于关联的查找

如何在 node 中转义 shell 命令的字符串?

按日期时间字段获取最新的 MongoDB 记录

续集findbyid不是一个函数,但显然findAll是

#!/bin/env是什么意思(在 node.js 脚本的顶部)?