我目前正在尝试从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/