Chrome系统调用等待异步结果

时间:2016-03-22 19:12:26

标签: javascript asynchronous google-chrome-extension

我正在使用Chrome扩展程序,该扩展程序将从Chrome.System apis收集信息,并立即使用所有数据。问题当然是这些调用是异步的。我没有很多关于JS的经验,所以我想确保我能以最简单的方式做到这一点。
我能想到的唯一方法是在回调中创建嵌套函数。

喜欢的东西:

chrome.identity.getProfileUserInfo(function(userinfo){
          getLocalIPs(userinfo.email, function(email, ips){
//keep passing data and nesting here.... and then do something after all calls are made
}
}

这似乎很难很快地阅读代码。做这样的事情的推荐方法是什么。使用同步编程,我想要完成这样的事情:

var email = getEmail();
var ip = getIP();
var processor = getProcessor();

dosomething(email, ip, processor);  

2 个答案:

答案 0 :(得分:5)

为什么当JavaScript本身有工具来处理它时,为什么要重新发明轮子呢?

具体来说,承诺。有一个very good article at HTML5Rock介绍了这个概念。

你制作了返回承诺的函数:

function getEmailPromise() {
  return new Promise(function(resolve, reject) {
    chrome.identity.getProfileUserInfo(function(userinfo) {
      resolve(userinfo.email);
    });
  });
}

然后你可以做你想做的事情:

var email = getEmailPromise();
var ip = getIPPromise();
var processor = getProcessorPromise();

Promise.all([email, ip, processor]).then(function(data) {
  // data is [email, ip, processor]
});

答案 1 :(得分:1)

嵌套函数会成为几个级别的负担。我建议按顺序运行每个异步调用,并在完成时为每个回调设置一个标志。

然后我会创建一个函数runIfReady(),它会在启动doSomething()之前检查是否设置了所有必需的标志。您可以在每个异步回调的末尾添加runIfReady()。完成所有细节后,doSomething()将立即运行。

您不必担心多次启动doSomething(),因为虽然回调是异步的,但一次只能运行一次。