2015-11-07 91 views
0

我是JavaScript異步概念的新手,來自C++背景。最近,我意識到我的一些功能不起作用,因爲他們沒有回覆承諾。Bluebird推廣功能

例如,此功能;

var CSVConverter=require("csvtojson").Converter; 

function get_json(cvs_file_location) 
{ 
    var data=fs.readFileSync(cvs_file_location).toString(); 
    var csvConverter=new CSVConverter(); 

    csvConverter.fromString(data,function(err,jsonObj){ 
     if (err){ 
      console.log("error msg: " + err); 
      return null; 
     } 

     var json_csv = clone_obj(jsonObj); 
     console.log(json_csv); 
     return json_csv; 
    }); 
} 

如果我嘗試根據函數的返回值分配一個變量,我會得到未定義的。

var alerts_obj = get_json(testData); 

get_json()如何修改以返回承諾?我想用藍鳥。我正在閱讀承諾書,但目前對於初學者來說,這是相當沉重的。

回答

1

如果您在使用藍鳥,你可以簡單地使用PromisificationpromisifyAll()

var Promise = require('bluebird'); 
var Converter = Promise.promisifyAll(require("csvtojson").Converter); 

,讓你的功能

function get_json(cvs_file_location) { 
    var data=fs.readFileSync(cvs_file_location).toString(); 

    return new Converter().fromString(data) 
     .then(function(jsonObj){ 
      var json_csv = clone_obj(jsonObj); 
      console.log(json_csv); 
      return json_csv; 
    }) 
     .catch(function(err) { 
      console.log("error msg: " + err); 
      return null; 
    });   
} 

編輯你的第二個評論:

你會怎麼做像這樣得到的價值:

get_json(cvs_file_location).then(function(val) { console.log(val) } 

但是你不能直接將它賦值給一個變量,因爲它是異步的。 看到這個問題和答案的更多見解在這裏:How to return value from an asynchronous callback function?

+0

Thanks! Upvoted。看起來很有希望。我可以promisifyAll任何node.js模塊? PromisifyAll後,我必須使用這個.then和.catch結構的每個功能,使用promisifyAll模塊? – user781486

+0

我可以問我如何使用新的'get_json()'返回一個promise,並將其分配給一個變量? – user781486

+1

您可以promisifyAll大多數/許多模塊,請參閱我上面發佈的第一個鏈接如何做到這一點。有時候你不得不與原型一起。你不必使用然後趕上,雖然你應該 – baao