2014-02-17 23 views
7

JavaScript中有一個相當複雜的異步系統。 JavaScript庫中的所有功能均設計爲異步。我們主要使用AngularJS延遲對象,並且一些部分使用jQuery(我們不會混淆它們 - 即Angular代碼在Angular推遲的promise上等待)。如何查找等待承諾的JavaScript代碼

我們遇到的問題是代碼在啓動時似乎「掛起」,5次中的2次。在JS代碼被緩存以及承諾解析的時間看起來有問題。

似乎沒有任何工具或任何可以指出發生掛起時有問題的代碼正在等待的內容。

如何查找等待承諾的JavaScript代碼?

謝謝。

+1

只是放棄這個:https://github.com/tildeio/ember-extension/pull/76它仍然是在製品,但它應該是可用的。也就是說,你也可以調試庫代碼。 –

+0

@FlorianMargaine這個擴展是針對Amber的,而OP則指的是AngularJS和jQuery的實現。我錯過了什麼嗎? –

+0

@EliranMalka它的承諾。它是由Ember的開發人員完成的,但它對承諾是通用的。 –

回答

1

所以這個錯誤實際上並沒有涉及承諾,而是依賴性加載的時間。我們使用LAB.js作爲文件加載器。 LAB.js支持JavaScript依賴關係的「鏈式」加載機制。

發生了什麼事情是我們沒有發佈的鏈條有兩個是相互關聯的。這兩個鏈是異步加載的,因此,在運行JavaScript文件時,有機會嘗試使用未加載的對象。

問題的癥結在於Angular.js 1.2.13在這種情況下悄然失敗。折角服務和異常從未傳播到更高級別的代碼的加載過程中出現的異常也沒有任何調試說它擊中了一個例外:

function getService(serviceName) { 
    if (cache.hasOwnProperty(serviceName)) { 
    if (cache[serviceName] === INSTANTIATING) { 
     throw $injectorMinErr('cdep', 'Circular dependency found: {0}', path.join(' <- ')); 
    } 
    return cache[serviceName]; 
    } else { 
    try { 
     path.unshift(serviceName); 
     cache[serviceName] = INSTANTIATING; 
     return cache[serviceName] = factory(serviceName); 
    } catch (err) { 
     if (cache[serviceName] === INSTANTIATING) { 
     delete cache[serviceName]; 
     } 
     throw err; 
    } finally { 
     path.shift(); 
    } 
    } 
} 

throw err上面沒有打通到瀏覽器,是在系統中的某個地方被捕獲並「被忽略」。

一旦我們發現了這個異常,就很容易跟蹤鏈加載問題。