2016-03-22 84 views
0

我正在研究Chrome擴展,它將從Chrome.System API收集信息並一次性使用所有數據。當然問題是這些電話是異步的。我沒有很多JS的經驗,所以我想確保我以最簡單的方式做到這一點。
我能想到的唯一方法是在回調中創建嵌套函數。Chrome系統調用正在等待異步結果

類似:

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); 

回答

1

嵌套功能成爲一種負擔在幾級我會建議運行,以每個異步調用,並設置標誌在完成每個回調。

然後,我會創建一個函數runIfReady(),該函數在啓動doSomething()之前檢查是否設置了所有必需的標誌。您可以將runIfReady()添加到每個異步回調的末尾。一旦所有的細節都在,doSomething()將立即運行。

您不必擔心多次啓動doSomething(),因爲儘管回調是異步的,但一次只能運行一個回調。

+0

謝謝!這很好。 – user568551

+0

@ user568551很高興爲您提供幫助(如果您想組織回調,標誌等......您可以考慮[原型模式](https://carldanley.com/js-prototype-pattern/)將其全部包裝乾杯 –

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] 
}); 
+0

我真的認爲這個答案應該被接受,[Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)用於延遲和異步計算(...)'或'Promiss.all(...)。然後(...)' –

+0

在chrome的上下文中,你可以編寫更優雅的代碼,比如'p1.then擴展,承諾是一個很好的解決方案,但也許答案應該注意[兼容性並非無處不在](http://caniuse.com/#feat=promises)用於一般目的。運行在大多數企業的瀏覽器不會支持這個一段時間 –