首页 > 解决方案 > 无法弄清楚如何正确格式化异步函数,以便脚本暂停,等待返回调用

问题描述

我试图弄清楚如何正确使用异步函数来达到如下所述的目的。

<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;
  });
}

标签: javascriptgoogle-chromegoogle-chrome-extension

解决方案


你的第一个功能很好。问题在于第二个功能。

您的第一个函数正在等待第二个函数。你只能等待一个承诺。第二个函数返回一个承诺。(到目前为止还不错)。

chrome.storage.local.get在 Promise 解决之前,第二个函数不会等待。它只是到最后,没有return声明,并将承诺(通过async关键字创建)解析为undefined.

所以:

  • async从第二个函数中删除关键字
  • new Promise()在第二个函数内部创建一个承诺
  • 回报那个承诺
  • 解决这个承诺,而不是从回调函数returnData中毫无意义地返回。returnData

进一步阅读:如何将现有的回调 API 转换为 Promise?


推荐阅读