ReferenceError:未定义解析

Posted

技术标签:

【中文标题】ReferenceError:未定义解析【英文标题】:ReferenceError: resolve is not defined 【发布时间】:2018-03-20 20:52:28 【问题描述】:

我有一个调用谷歌语音 API 的函数。看起来一切都很好,但我找不到为什么它给了我错误。我是 node 和 promise 的初学者,所以不知道为什么会出现这个错误。

ReferenceError: 在 index.js:57 中未定义解析

问题出在这部分代码中:

  return speech
    .longRunningRecognize(responses)
    .then(function(results) 
      var operation = responses[0];
      console.log("Operation: ", operation);
      return operation.promise();
    )
    .then(function(responses) 
      resolve(responses[0]);
      console.log("Result: ", JSON.stringify(responses[0]));
    )

承诺在哪里

operation.promise()(第 57 行)

无法解决。它想解决 承诺,但它似乎找不到解析函数。

Google API 的工作方式如下:

首先,您调用 api 来上传您的数据并启动该过程。 这将为您返回一个操作名称。 此名称应随后在结果准备好时用于获取结果(最多只需 30 秒)

我感觉一切正常,拨打电话,回复回复。代码等待,然后它想解析,但它不能...

我的代码是这样的(它是一个云函数)

  exports.transcribeAudio = functions.storage.object().onChange(event => 
  const object = event.data;
  const filePath = object.name;
  const fileName = filePath.split("/").pop();
  const fileBucket = object.bucket;
  const bucket = gcs.bucket(fileBucket);
  const tempFilePath = path.join(os.tmpdir(), fileName);

  // Exit if this is triggered on a file that is not an image.
  // Get the file name.
  //const fileName = path.basename(filePath);
  console.log(filePath + " name: " + fileName);
  // Exit if the image is already a thumbnail.
  if (!filePath.startsWith("ucl-flac-audio")) 
    console.log("Only flac-audio need to be converted");
    return true;
  
  // Exit if this is a move or deletion event.
  if (object.resourceState === "not_exists") 
    console.log("This is a deletion event.");
    return true;
  

  return Promise.resolve()
    .then(() => 
      const audioFilename = "gs://" + fileBucket + "/" + filePath;
      console.log(audioFilename);
      const request = 
        config: 
          encoding: "FLAC",
          languageCode: "fr-FR"
        ,
        audio: 
          uri: audioFilename
        
      ;

      return speech
        .longRunningRecognize(request)
        .then(function(responses) 
          var operation = responses[0];
          console.log("Operation: ", operation);
          return operation.promise();
        )
        .then(function(responses) 
          resolve(responses[0]);
          console.log("Result: ", JSON.stringify(responses[0]));
        )
        .catch(function(err) 
          console.error("Failed to get transcript.", err);
          //    reject(err);
        );
    )
    .catch(err => 
      return Promise.reject(err);
    );
);

【问题讨论】:

您已经在 .then 回调中。只需return responses[0],由 .then 创建的承诺将解析为该值。 顺便说一句,这:.catch(err => return Promise.reject(err); ); 完全没有意义。只需删除这些行。 【参考方案1】:

您不能在 .then() 处理程序中调用 resolve()。那里没有定义这样的功能。如果您想在 .then() 处理程序中设置 promise 的解析值,您可以返回该值。

改变这个:

.then(function(responses) 
      resolve(responses[0]);
      console.log("Result: ", JSON.stringify(responses[0]));
)

到这里:

.then(function(responses) 
      console.log("Result: ", JSON.stringify(responses[0]));
      return responses[0];
)

仅供参考,您可能想到的 resolve() 是新 Promise 执行器回调的参数:

let p = new Promise(function(resolve, reject) 
    resolve(10);
);

而且,这是您使用它的上下文。

【讨论】:

谢谢你解释了这个问题!然后我可以在那个返回中将它写入谷歌云存储桶吗? 'return bucket .file(filename) .save(JSON.stringify(responses[0])) 之类的东西还是异步操作,我应该使用类似 return new Promise(resolve,reject) 等的东西 @Koen - 我不知道 Google API。如果bucket.file(...).save(...) 返回一个promise,那么您可以从.then() 处理程序中返回它。如果没有,你需要先承诺它。 @jsfriend00 谢谢!我刚刚在退货中添加了它,现在一切都很好!谢谢【参考方案2】:

在使用resolve 之前,您需要将resolve 作为参数传递:

在这种情况下,

return new Promise((resolve, reject) => 
          axios.post('YOUR URL HERE', params)
                .then(response =>                     
                    resolve() // Here you can use resolve as it passed as argument
                )
);

注意:axios调用可以使用GET、POST方式

【讨论】:

没错,即使我遇到同样的错误,我也忘记为axios.post创建新的承诺,现在我完全理解了,谢谢

以上是关于ReferenceError:未定义解析的主要内容,如果未能解决你的问题,请参考以下文章

ReferenceError:数据未在exports.action中定义

Nuxt.js 中的“文档未定义”

ReferenceError:未定义提取

未定义函数 - 未捕获的 ReferenceError

打字稿 - 未捕获的 ReferenceError:未定义导出

ReferenceError: $ 未定义