【问题标题】:Wait for javascript callback function to finish等待javascript回调函数完成
【发布时间】:2026-02-09 11:00:02
【问题描述】:

我正在使用 google storage api 在异步函数中将文件保存在 gcp 存储桶中。我想等到回调中出现错误或成功,然后我才想继续执行其他代码行,但我在成功或错误之前得到 LastMessage。

https://googleapis.dev/nodejs/storage/latest/File.html#save

await file.save(jsonData.trim(), {resumable : false}, function(error) {
 if (error) {
   console.log('error');
 } else {
   console.log('success');
 }
})

console.log( "LastMessage: Error or Success is received, only then log this message")

【问题讨论】:

  • 您确定.save() 在您传递回调时返回一个承诺吗?如果没有,await 将不会等待。

标签: javascript node.js async-await google-api


【解决方案1】:

您的.save() 没有返回承诺。而是给回调。 您可以创建一个传统的 promise 方法来获得您想要实现的目标。 这是代码 sn-p -


const saveFile = (jsonData) => {
    return new Promise((resolve, reject) => {
        file.save(jsonData.trim(), { resumable: false }, function (error) {
            if (error) {
                console.log('error');
                reject()
            } else {
                console.log('sucess');
                resolve()
            }
        })
    })
}

await saveFile()

console.log("LastMessage: Error or Success is received, only then log this message")

【讨论】:

    【解决方案2】:

    文档中有一个例子

    https://googleapis.dev/nodejs/storage/latest/File.html#save-examples

    const {Storage} = require('@google-cloud/storage');
    const storage = new Storage();
    const myBucket = storage.bucket('my-bucket');
    
    const file = myBucket.file('my-file');
    const contents = 'This is the contents of the file.';
    
    file.save(contents, function(err) {
      if (!err) {
        // File written successfully.
      }
    });
    
    //-
    // If the callback is omitted, we'll return a Promise.
    //-
    file.save(contents).then(function() {});
    

    您不需要使用 await,对于您的示例,您可以试试这个:

    file.save(jsonData.trim(), {resumable : false})
    .then(() => nextFunc())
    .catch(() => nextFunc())
    
    function nextFunc() {
       console.log( "LastMessage: Error or Success is received, only then log this message")
    }
    

    【讨论】: