標籤:code ext c 檔案 a 使用
情境:有一個函數接收一個URL的數組,要求依次下載每個檔案直到所有檔案被成功下載。
如果API是同步的,很容易使用一個迴圈來實現
var downloadAllSync = function(urls) { urls.foreach(function(url){ try{ return downloadOneSync(url); }catch(e) {} }); throw new Error(‘all downloads failed‘);}
但是用這種方式實現downloadAllAsync並不能正確工作。因為我們不能在回呼函數中暫停迴圈並恢複。它只會啟動所有的下載,而不是等待一個完成再試下一個。
var downloadAllAsync = function(urls, callback) { urls.foreach(function(url) { downloadOneAsync(url, function(error, r) { ... }); // loop continues })}
解決方案是將迴圈實現為一個函數tryNextURL,我們可以決定何時開始每次迭代。
var downloadAllAsync = function(urls, callback) { var len = urls.length, tryNextURL = function(i) { // 作為計數器, 最終結果提示不正確的 if(i >= n) return setTimeout(onerror.bind(null, ‘all downloads failed‘), 0); downloadOneAsync(urls[i], function() { tryNextURL(i + 1); // 在事件迴圈單獨輪次中執行迭代 }) }; tryNextURL(0); // 開始下載檔案}
參考:編寫高品質JS代碼68個有效方法