2014-06-29 59 views
1

我一直在JavaScript代碼中回調地獄,我相信這是由我以前的經驗主要是純同步/線程Java代碼。實際的代碼示例應該如何構造以避免回調地獄?

我學習的榜樣很好,但有,作爲然而,一直無法「前後」的例子回調地獄的很多,我發現它出現在的情況下解決了找​​好。

我將不勝感激如果某種靈魂可以告訴我下面提供的代碼應該是什麼樣的結構,以避免回調地獄(如果需要,可以使用異步庫等庫),因爲我相信一個實際的例子會讓我和其他人閱讀這個問題。

用這一段時間,我仍然無法找到一種工作方式,它將允許在原始回調中調用以及保留代碼的邏輯。

任何幫助,如果很好的讚賞,謝謝你的時間。 :)

代碼: var fs = require('fs'); var zlib = require('zlib');

var defaultOptions = require('./options/defaults'); 

function FeatherDB (sourcePath, options) 
{ 
    if (options === undefined) 
    { 
     // use defaults if options not provided 
     options = defaultOptions; 
    } 
    else 
    { 
     // ensure all keys are supplied 
     for (key in defaultOptions) 
     { 
      if (options[key] === undefined) 
      { 
       options[key] = defaultOptions[key]; 
      } 
     } 
    } 

    this.sourcePath = sourcePath; 
    this.options = options; 
} 

FeatherDB.prototype.load = function (callback) 
{ 
    var thiz = this; 
    fs.exists(this.sourcePath, function (error, doesExist) { 
     if (error) 
     { 
      callback(error); 
      return; 
     } 

     if (doesExist) 
     { 
      fs.readFile(thiz.sourcePath, function (error, rawFileData) { 
       if (error) 
       { 
        callback(error); 
        return; 
       } 

       if (thiz.options.compress) 
       { 
        zlib.gunzip(rawFileData, function (error, rawUncompressedData) { 
         if (error) 
         { 
          callback(error); 
          return; 
         } 

         try 
         { 
          thiz.documents = JSON.parse(rawUncompressedData.toString('utf8')); 
         } 
         catch (error) 
         { 
          callback(error); 
          return; 
         } 

         callback(null); 
        }) 
       } 
       else 
       { 
        try 
        { 
         thiz.documents = JSON.parse(rawFileData.toString('utf8')); 
        } 
        catch (error) 
        { 
         callback(error); 
         return; 
        } 

        callback(null); 
       } 
      }) 
     } 
     else 
     { 
      thiz.documents = {}; 
      callback(null); 
     } 
    }) 
} 
+0

你試過wait.for? https://github.com/luciotato/waitfor –

回答

1

我把它格式化了,並刪除了fs.exists檢查。如果文件不存在,則readFile將失敗並返回錯誤。像瀑布,系列

FeatherDB.prototype.load = function (callback) { 
    var thiz = this; 

    fs.readFile(thiz.sourcePath, function (error, rawFileData) { 
     if (error) { 
      thiz.documents = {}; 
      return callback(error); 
     } 

     if (!thiz.options.compress) { 
      FeatherDB.parse(rawFileData.toString('utf-8'), callback); 
      return; 
     } 

     zlib.gunzip(rawFileData, function (error, rawUncompressedData) { 
      if (error) { 
       return callback(error); 
      } 
      FeatherDB.parse(rawUncompressedData.toString('utf-8'), callback); 
     }); 
    }); 
} 

FeatherDB.prototype.parse(data, callback) { 
    try { 
     thiz.documents = JSON.parse(data); 
    } catch (error) { 
     return callback(error); 
    } 

    callback(); 
} 

如果你開始做更多的嵌套的東西,你可以考慮使用async。*功能,平行等

+0

謝謝,這當然是一個改進:)你認爲會有一種方式,所有的內聯函數可以提取,仍然保持理智? – Hoolean

+0

那麼取決於這種情況下的函數,在解析被提取出來之後,加載函數並沒有那麼長時間,但是如果函數較大,那麼我可能會重構它並提取出更多的函數。 –

相關問題