【发布时间】:2018-05-16 06:29:07
【问题描述】:
我很长时间以来一直在努力解决这个问题;对于它来说太长了,几乎可以肯定是微不足道的。
我想得到一个特定的值,就好像它是一个函数返回的一样。 Promise 应该是值的占位符,并且 onAuthRequired 接受一个返回 a blocking response object 的函数:
{
authCredentials: {
username: "..."
password: "..."
}
}
所以我需要创建一个函数来返回该结构并异步执行。所以我输入了async 关键字,意思是我可以await 承诺的解决方案......我想。
但在我可以构建该结构之前,我必须对 nativeMessaging API 进行异步操作......它不会返回承诺......我想。
所以我必须以某种方式将它包装在一个承诺中......
编辑: 我更新了下面的代码以反映当前状态,这是迄今为止所有出色响应的混合体。
async function get_data() {
return new Promise((resolve, reject) => {
var data = chrome.runtime.sendNativeMessage('Host', {text:'Ready'},
function(response) {
resolve(response);
}
};
})
};
async function get_creds() {
var data = await get_data();
if (null != data) {
creds = JSON.parse(data);
return {
authCredentials: {
username: creds.username,
password: creds.password
}
};
}
};
chrome.webRequest.onAuthRequired.addListener(
function(details, get_creds),
{urls: ["<all_urls>"]},
['blocking']
);
我尝试了以下代码:
chrome.webRequest.onAuthRequired.addListener(
function handler(details){
var creds = await get_data(); // Uncaught SyntaxError: unexpected identifier
creds = JSON.parse(creds);
return {
authCredentials: {
username: creds.username,
password: creds.password
}
};
},
{urls:["<all_urls>"]},
['asyncBlocking']
);
它直接调用了get_data(),但出现了意外的标识符错误。
如果我删除了 await 关键字,它“工作”......也就是说,它试图对事件做一些事情......但它没有将对象传回。它所做的是在屏幕左下角设置一条消息“等待扩展......”并调用get_data()函数大约3次。
如果我将['asyncBlocking'] 更改为['blocking'],它根本无法调用get_data()。
我不知道这里发生了什么。
所以这应该通过这些奇怪的承诺将 Native Messaging Host 返回的值传递回来,然后直接插入 onAuthRequired 期望返回其 JSON 结构的位置......
编辑:
我希望 get_creds() 返回的对象被传递给 onAuthRequired。
目前,function(details, get_creds) 上有一个“意外令牌”令牌......所以这显然是错误的。
我怀疑我可能需要在 get_creds() 中使用另一个承诺来填充 authCredentials 对象...
除了所有我无法理解其来源的意外标识符之外,我有一种感觉,我在做这整件事。
欢迎结束我的智慧......感谢您对我的无知的任何启发。
【问题讨论】:
-
你能分享一下输出是什么吗?预期的输出是什么?
-
没有输出 - 代码没有运行并且没有输出。预期的结果在帖子的顶部 - 显示的 JSON 是应该生成的。
标签: javascript asynchronous google-chrome-extension promise