2016-04-21 92 views
2

所以...我最近遇到了這個節點模塊:async。我只需要針對我下面的情況做一點「展示並告訴」或最佳實踐方法。在下面你可以看到我的功能GetBearerToken,它的參數{bearer_token:token}沒有問題。利用異步NPM模塊

我的問題是變量ss。我想在此函數之外使用它,並將其傳遞給另一個函數來執行某些操作。當然,當我嘗試訪問ss時,它是未定義的。我已經嘗試了一些如文檔中指出的那樣進行這項工作的方法,但我顯然錯過了一些東西。因此,任何幫助將是巨大的...謝謝

GetBearerToken({ 
     bearer_token: token 
    }, function(error, result) { 
     if (error) throw error; 
     if (result) { 
     var resultset 
     var i; 
     for (i = 0; i < result.length; i++) { 
      resultset = (simpleObjectify(result[i].meta, result[i].rows)) 
     } 

     var jstring = JSON.stringify(resultset); 
     var obj = JSON.parse(jstring); 
     var ss = obj[0].uuid; 
     console.log(ss) 
     }) 

的功能ss外面是undefined

+0

謝謝Seth的編輯,非常感謝。 –

回答

1

首先閱讀本

What is the scope of variables in JavaScript?


您可以嘗試使用.waterfall方法

瀑布(任務,[回調])

運行的任務陣列功能串聯,每一個都通過ir 結果到數組中的下一個結果。但是,如果任何任務將 錯誤傳遞給其自己的回調,則不會執行下一個函數,並且主回調將立即被調用並返回錯誤。

一個例子給你所要完成

async.waterfall([ 
     function(callback) { 

     GetBearerToken({ 
       bearer_token: token 
      }, function(error, result) { 
       if (error) throw error; 
       if (result) { // *note* don't forget to handle the result properly if an error occurs or the result is not what you expected. 
       var resultset 
       var i; 
       for (i = 0; i < result.length; i++) { 
        resultset = (simpleObjectify(result[i].meta, result[i].rows)) 
       } 

       var jstring = JSON.stringify(resultset); 
       var obj = JSON.parse(jstring); 
       var ss = obj[0].uuid; 
       callback(null, ss); // call the next callback in waterfall with ss value 
       } 
      ) 
      }, 
      function(arg1, callback) { 
      // arg1 now equals ss value 
      callback(null,'all completed'); 
      } 
     ], 
     function(err, result) { 
     // result now equals 'all completed' 
     }); 

什麼,但因爲上面的代碼似乎已經是一步走向錯誤的方向,當 來調試。但看看.waterfall的例子,它分解了回調,然後調用.waterfall方法。

+0

謝謝GeoPhoenix的建議。我繼續清理代碼並考慮了您的建議和示例。最後一個問題,我會考慮這個答案。如果我想將整個事件包裝到一個更大的函數中,然後獲取異步功能的輸出,比如輸出1爲完整或錯誤爲0,那麼最佳方法是什麼? –

+0

「最好的方法」是你更好的理解和更簡單的實施。本質上,我會在瀑布內創建一個瀑布,如果我只使用「異步」,但這種方法對於大多數用戶來說會很複雜。我會考慮使用'事件'或承諾,並正確地構建我的代碼儘可能保持和簡單。 – Gntem

+0

謝謝GeoPhoenix。你是對的,我需要把我的頭圍繞異步概念更好一點。有了「事件」,你在說EventEmitter類中的Event Emitter嗎?再次感謝。 –