我正在使用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);
答案 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()
,因为虽然回调是异步的,但一次只能运行一次。