使用电子在多个回调函数中返回值时出错

Error returning values in multiple callback functions with electron

我目前正在尝试从 electron-json-存储数据库中获取一个值并 return 它。

function getWithExpiry(key) {
    var grabbed = "";
    storage.has(key, function (error, hasKey){
        if (error) throw error;

        if (hasKey){
            storage.get(key, function (error, data){
                if (error) throw error  
                const item = JSON.parse(data)
                const now = new Date()

                if (now.getTime() > item.expiry) {
                    storage.remove(key, function (error) {
                        if (error) throw error
                        grabbed = null
                    })
                }else{
                    console.log(item.value)
                    grabbed = item.value
                }
            })
        }
    })
    console.log(grabbed)
    return grabbed;
}

我这样称呼它:

setTimeout(async () => {
         var tokenpass = getWithExpiry('captcha')
         console.log(tokenpass)
         await page.evaluate((tokenpass) => {document.getElementById("g-recaptcha-response").innerText = `${tokenpass}`}, tokenpass)
         await page.click('input.button').then(console.log('Clicked'));

console.logs return 的调用顺序不同。首先是 returns "" from console.log(grabbed) in getWithExpiry(key),然后是 "" from console.log(tokenpass),然后是 console.log('Clicked'),然后是 console.log(item.value) 的期望值.我认为这些 console.logs 的顺序可能是 getWithExpiry 没有 return item.value 的原因。

木偶师

await page.waitFor(1000); 因为元素需要一些时间来更新,当你改变 innterText

 async function getWithExpiry(key) {
  return new Promise((res, rej) => {
    storage.has(key, function (error, hasKey) {
      if (error) rej(error);

      if (hasKey) {
        storage.get(key, function (error, data) {
          if (error) rej(error);
          const item = JSON.parse(data);
          const now = new Date();

          if (now.getTime() > item.expiry) {
            storage.remove(key, function (error) {
              if (error) rej(error);
              res(null);
            });
          } else {
            console.log(item.value);
            res(item.value); 
          }
        });
      }
    });
  });
}

setTimeout(async () => {
  var tokenpass = await getWithExpiry("captcha");
  console.log(tokenpass);
  await page.evaluate((tokenpass) => {
    document.getElementById("g-recaptcha-response").innerText = `${tokenpass}`;
  }, tokenpass);

  await page.waitFor(1000);
  await page.click("input.button").then(console.log("Clicked"));
});