等待 executeScript 完成
Wait for executeScript to finish
我有这个脚本,我从 Chrome 扩展
执行
export const getData = () => {
chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
chrome.tabs.executeScript(
tabs[0]?.id,
{ code: `document.getElementById('a1').innerHTML;` }, parseData
);
});
};
const parseData = (result: any) => {
const obj = new Something();
// Do complex stuff with this object
chrome.storage.sync.set(
{
id: obj.id,
}
);
console.log('ID from extract', obj.id);
};
在我的后台脚本中,我调用了这个函数,然后调用了通过chrome存储获取解析数据的函数,所以这两个函数都将回调作为参数。
我需要第一个函数在执行另一个函数之前完成,但它完全忽略了 await
,我不确定为什么以及如何让它等待,如果可能的话
后台脚本
chrome.runtime.onMessage.addListener(async(request, sender, sendResponse) => {
let list = [];
await getData();
await getExtractedData((value) => {
// Do a lot of stuff with `list`
console.log('After extract:', value);
});
}
);
getExtractedData
函数在另一个文件中:
export const getExtractedData = (callback) => {
return chrome.storage.sync.get(
[
'id',
],
callback);
};
应该打印这个:
ID from extract 123456
After extract {id: 123456}
但它目前正在这样做:
After extract {id: 123455}
ID from extract 123456
(提取后会记录它在之前 运行 中提取的内容,但不会在当前 运行 中记录)
函数需要 return 一个正确连接的 Promise resolve/reject。
const getData = () => new Promise(resolve => {
chrome.tabs.executeScript({code: `document.getElementById('a1').innerHTML`}, res => {
parseData(res).then(resolve);
});
});
const parseData = (data) => new Promise(resolve => {
// Do complex stuff with this object
chrome.storage.sync.set({id: obj.id}, () => resolve(obj.id));
});
const getExtractedData = () => new Promise(resolve => {
chrome.storage.sync.get('id', data => resolve(data.id));
});
顺便说一句,您不需要存储,因为 getData 的 Promise 链已经解析为已处理的 ID:
async foo => {
const resultId = await getData();
// ..........
}
我有这个脚本,我从 Chrome 扩展
执行export const getData = () => {
chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
chrome.tabs.executeScript(
tabs[0]?.id,
{ code: `document.getElementById('a1').innerHTML;` }, parseData
);
});
};
const parseData = (result: any) => {
const obj = new Something();
// Do complex stuff with this object
chrome.storage.sync.set(
{
id: obj.id,
}
);
console.log('ID from extract', obj.id);
};
在我的后台脚本中,我调用了这个函数,然后调用了通过chrome存储获取解析数据的函数,所以这两个函数都将回调作为参数。
我需要第一个函数在执行另一个函数之前完成,但它完全忽略了 await
,我不确定为什么以及如何让它等待,如果可能的话
后台脚本
chrome.runtime.onMessage.addListener(async(request, sender, sendResponse) => {
let list = [];
await getData();
await getExtractedData((value) => {
// Do a lot of stuff with `list`
console.log('After extract:', value);
});
}
);
getExtractedData
函数在另一个文件中:
export const getExtractedData = (callback) => {
return chrome.storage.sync.get(
[
'id',
],
callback);
};
应该打印这个:
ID from extract 123456
After extract {id: 123456}
但它目前正在这样做:
After extract {id: 123455}
ID from extract 123456
(提取后会记录它在之前 运行 中提取的内容,但不会在当前 运行 中记录)
函数需要 return 一个正确连接的 Promise resolve/reject。
const getData = () => new Promise(resolve => {
chrome.tabs.executeScript({code: `document.getElementById('a1').innerHTML`}, res => {
parseData(res).then(resolve);
});
});
const parseData = (data) => new Promise(resolve => {
// Do complex stuff with this object
chrome.storage.sync.set({id: obj.id}, () => resolve(obj.id));
});
const getExtractedData = () => new Promise(resolve => {
chrome.storage.sync.get('id', data => resolve(data.id));
});
顺便说一句,您不需要存储,因为 getData 的 Promise 链已经解析为已处理的 ID:
async foo => {
const resultId = await getData();
// ..........
}