Javascript 抓住JS承诺

Javascript 抓住JS承诺,javascript,node.js,promise,Javascript,Node.js,Promise,我试着让我的头绕过承诺,在这个例子中,在一个循环中 我的方案是将文件上传到谷歌硬盘。我的理解是,每个文件都应该上传,然后在承诺解决后再上传下一个,以此类推 目前,我有一个功能,将上传一个文件,并在完成后返回一个承诺: # upload.js const google = require('googleapis'); const drive = google.drive('v3'); function uploadFile(jwtClient, fileMetadata, media) {

我试着让我的头绕过承诺,在这个例子中,在一个循环中

我的方案是将文件上传到谷歌硬盘。我的理解是,每个文件都应该上传,然后在承诺解决后再上传下一个,以此类推

目前,我有一个功能,将上传一个文件,并在完成后返回一个承诺:

# upload.js
const google = require('googleapis');
const drive = google.drive('v3');

function uploadFile(jwtClient, fileMetadata, media) {
  return new Promise((resolve, reject) => {
    drive.files.create({
      auth: jwtClient,
      resource: fileMetadata,
      media,
      fields: 'id, modifiedTime, originalFilename'
    }, (err, uploadedFile) => {
      if (err) reject(err);
        // Promise is resolved with the result of create call
        console.log("File Uploaded: " + uploadedFile.data.originalFilename);
        resolve(uploadedFile)
    });
  });
}

module.exports = uploadFile;
然后我想在循环中使用这个函数,我在这里的想法是,在uploadFile函数返回承诺之前,循环的下一次迭代不应该发生

所以文件上传不是为了确定它们是否应该被上传?我猜不是因为它都是异步发生的

我希望了解如何确保这些文件按顺序上传,如果这确实是最好的方式,并确保文件上传在进入下一个文件之前解决了承诺

我还希望我可以将脚本的auth部分包装成一个承诺,到目前为止还没有成功。

只需将async/wait放在它们所属的位置

async function uploadFile(jwtClient, fileMetadata, media) ...

async function uploadManyFiles(...)
    for(....)
       await uploadFile(...)
这样可以确保按顺序执行上载。如果您希望这些承诺同时发生,请将其分组。全部:

使用auth与上载完全相同:

async function auth(...)
    return new Promise((resolve, reject) => {
       jwtClient = ...
       jwtClient.authorize((authErr) => {
         if (authErr) {
             reject(authErr);
         else
             resolve(whatever)

谢谢,这很有帮助,同时也阅读了更多关于async/await的内容,对于我个人来说,看到一个我正在研究的示例也很有帮助
async function uploadFile(jwtClient, fileMetadata, media) ...

async function uploadManyFiles(...)
    for(....)
       await uploadFile(...)
  await Promise.all(files.map(uploadFile))
async function auth(...)
    return new Promise((resolve, reject) => {
       jwtClient = ...
       jwtClient.authorize((authErr) => {
         if (authErr) {
             reject(authErr);
         else
             resolve(whatever)