javascript - 用 Electron 返回多个回调函数中的值时出错

标签 javascript callback electron puppeteer

我目前正在尝试从electronic-json-storage数据库中获取一个值并将其返回。

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返回的顺序与调用的顺序不同。首先,它从console.log(grabbed)中的getWithExpiry(key)返回“”,然后从console.log(tokenpass)返回“”,然后从console.log('Clicked')返回,然后从console.log(item.value)返回期望值。我认为这些console.logs的顺序可能是getWithExpiry不返回item.value的原因。

最佳答案

puppeteer 戏
获取await page.waitFor(1000);因为当您更改innerText

 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"));
});
时,元素需要花费一些时间来更新

关于javascript - 用 Electron 返回多个回调函数中的值时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62369077/

相关文章:

javascript - '引用错误: httpResponse is not defined' When parsing JSON response of Parse httpRequest

javascript - fetch catch return JSON 中位置 0 处的意外标记 U

php - 为什么 PHP 的 call_user_func() 函数不支持引用传递?

node.js - 整洁的回调 node.js

javascript - React + Electron webview标签预加载js不起作用

javascript - querySelectorAll 使用两个或多个数据集作为查询

javascript - 以 xml 作为请求数据的 html 中的 POST 请求示例

javascript - jQuery 的隐式循环变为 "both ways"?

即使回调 IsOneWay,WCF 客户端也因回调而死锁

javascript - 在没有序列化的情况下在主窗口和窗口之间共享数组