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中定义