javascript - 无法弄清楚如何正确格式化异步函数,以便脚本暂停,等待返回调用
问题描述
我试图弄清楚如何正确使用异步函数来达到如下所述的目的。
<code>
async function commentGrabSwitchboard(){
let prevStored = await checkStorage();
if(IsAmazonFirstProductPage(document)){
if(prevStored == undefined){
collectProductComments();
}else{
console.log("Results retrieved from chrome local storage: \n" + JSON.parse(prevStored));
}
}
}
</code>
这个功能被设计成一个交换机。它做两件事之一——调用 collectProductComments 或(现在)控制台记录结果——取决于 checkStorage 函数的返回值:
<code>
async function checkStorage(){
let key = location.host + location.pathname;
try{
chrome.storage.local.get(key, function(result) {
let returnData = result[key];
return returnData;
});
}catch(err){
console.log("Results for domain: " + key + "could not be retrieved from chrome local storage. Error: " + err);
}
}
</code>
此函数检查本地存储中的值,并返回该值。如果它什么也没找到,则返回值是未定义的。我遇到的问题是,在声明变量 prevStored = checkStorage 后,脚本不等待 checkStorage 解决,因此 if 语句“prevStored == undefined”始终为真。我已经验证 checkStorage 函数确实从本地存储返回了预期值。
谁能给我一些关于我做错事情的指示?也欢迎任何替代解决方案。谢谢。
临时:更改为第二个功能
function checkStorage(){
let key = location.host + location.pathname;
let storageSearched;
let returnData;
try{
chrome.storage.local.get(key, function(result) {
returnData = result[key];
storageSearched = true;
});
}catch(err){
console.log("Results for domain: " + key + "could not be retrieved from chrome local storage. Error: " + err);
storageSearched = false;
}
let promise = new Promise((resolve, reject) => {
if(storageSearched){
resolve(returnData);
}else{
reject();
}
});
promise.then(function(fromResolve){
return fromResolve;
});
}
解决方案
你的第一个功能很好。问题在于第二个功能。
您的第一个函数正在等待第二个函数。你只能等待一个承诺。第二个函数返回一个承诺。(到目前为止还不错)。
chrome.storage.local.get
在 Promise 解决之前,第二个函数不会等待。它只是到最后,没有return
声明,并将承诺(通过async
关键字创建)解析为undefined
.
所以:
async
从第二个函数中删除关键字new Promise()
在第二个函数内部创建一个承诺- 回报那个承诺
- 解决这个承诺,而不是从回调函数
returnData
中毫无意义地返回。returnData
推荐阅读
- angular - 离子电容器 CameraPreview - 相机始终位于顶部。不可能有 HTML 覆盖
- shopify - 在 shopify 主题中添加“新”、“销售”等产品标签
- flutter - 如何在 Flutter 上使用 audio_service 使用本地化的 MediaItem 标题和专辑
- html - Flexbox "flex: 1" 没有正确居中并且 "flex-grow" 推高其他内容
- python - 从 keras fashion_mnist 加载数据时出现 URL 错误 403
- java - 发送前修改springframework.ws.WebServiceMessage xml
- python - 如何从模型传递上下文并在 odoo 中查看?
- oauth - 授权代码流 - 来自多个选项卡的并发请求
- html - 如何使列表组在 div 内滚动而不是包装它的高度?
- db2 - IBM 云上的 Db2 是否支持文本搜索功能?