如何等待一个异步方法的回调返回值? [英] How to wait for an asynchronous method's callback return value?
问题描述
我知道,等待一个异步方法是愚蠢的,<一个href=\"http://stackoverflow.com/questions/5010288/how-to-make-a-function-wait-until-a-callback-has-been-called-using-node-js\">one应该使用回调,而不是。但是,如果一个第三方API的力量,你将成为怎样的同步?
I know that waiting for an asynchronous method is stupid, one should use callbacks instead. But what if an third party API forces you to be synchronous?
我正在开发一个Chrome扩展,将prevent从访问网站中已有的另一个标签中打开用户。基本上,我需要先删除基于在打开的标签页的URL的请求。我想用 chrome.webRequest.onBeforeRequest
是这样的:
I'm developing a Chrome Extension that will prevent the user from visiting websites that's already open in another tab. I basically need to cancel requests based on the urls in open tabs. I want to use chrome.webRequest.onBeforeRequest
like this:
function onBeforeRequest(details) {
var websiteAlreadyOpenInOtherTab;
// Here i want to set `websiteAlreadyOpenInOtherTab` by using the `chrome.tabs`
// API. It's asynchronous though and that's my problem. I cant return a value
// from an asynchronous method call.
if (websiteAlreadyOpenInOtherTab) {
return { cancel: true };
}
}
chrome.webRequest.onBeforeRequest.addListener(
onBeforeRequest,
{ urls: ['<all_urls>'], types: ['main_frame'] },
['blocking']);
希望你看到上面的code我的困境。我需要返回基于异步方法调用的结果的对象。是否有可能实现这一目标?
Hopefully you see my dilemma in the code above. I need to return an object based on the result of asynchronous method calls. Is it possible to achieve this?
推荐答案
的 也许的就可以解决通过跟踪标签URL的问题:
Maybe you can solve the problem by keeping track of the tab URLs?:
- 当应用程序启动时,通过获取所有打开的标签页网址
chrome.tabs.query
- 订阅
chrome.tabs.onUpdated
和chrome.tabs.onRemoved
添加/删除/更新URL当他们改变。
- When the app starts, get all open tab URLs by using
chrome.tabs.query
- Subscribe to
chrome.tabs.onUpdated
andchrome.tabs.onRemoved
and add/remove/update the URLs when they change.
某种code例子基础上,文档:
Some kind of code example based on the documentation:
var tabUrlHandler = (function() {
// All opened urls
var urls = {},
queryTabsCallback = function(allTabs) {
allTabs && allTabs.forEach(function(tab) {
urls[tab.id] = tab.url;
});
},
updateTabCallback = function(tabId, changeinfo, tab) {
urls[tabId] = tab.url;
},
removeTabCallback = function(tabId, removeinfo) {
delete urls[tabId];
};
// init
chrome.tabs.query({ active: true }, queryTabsCallback);
chrome.tabs.onUpdated.addListener(updateTabCallback);
chrome.tabs.onRemoved.addListener(removeTabCallback);
return {
contains: function(url) {
for (var urlId in urls) {
if (urls[urlId] == url) {
return true;
}
}
return false;
}
};
}());
现在你应该可以问 tabUrlHandler
直接在 onBeforeRequestMethod
:
Now you should be able to ask the tabUrlHandler
directly in your onBeforeRequestMethod
:
function onBeforeRequest(details) {
var websiteAlreadyOpenInOtherTab = tabUrlHandler.contains(details.url);
if (websiteAlreadyOpenInOtherTab) {
return { cancel: true };
}
}
这篇关于如何等待一个异步方法的回调返回值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!