2015-11-07 58 views
0

該函數不返回承諾。這個代碼提供了什麼功能?

它使用csvtojson模塊。 https://www.npmjs.com/package/csvtojson

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 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().fromStringAsync(data) 
     .then(function(csvString){ 
      var json_csv = clone_obj(csvString); 
      console.log(json_csv); 
      return json_csv; 
     }) 
     .catch(function(cb) { 
      console.log("error msg: " + cb); 
      return null; 
     }); 
} 

不幸的是,它不起作用。錯誤消息看起來像這樣;

return new Converter().fromStringAsync(data) 
        ^TypeError: (intermediate value).fromStringAsync is not a function 

什麼是錯的代碼?還是有另一種方式來編寫代碼來返回承諾?

+0

如果用'括起來:'(new Converter())。fromStringAsync'換行'new Converter()'會怎麼樣? – zerkms

+0

不幸的是,仍存在相同的錯誤 – user781486

+0

'fromStringAsync'方法在該模塊中不存在 –

回答

2

你必須promisify的prototypeConverter的,因爲它是一個構造函數。如果Converter對象直接具有promisified功能(如大多數API的情況),則常規var Converter = Promise.promisifyAll(require('csvtojson').Converter));可以工作。

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

var converter = new Converter(); 
converter.fromStringAsync(fs.readFileSync('foo.csv', 'utf8')) 
    .then(console.log) 
+0

我愛你。我希望我能給你100票!代碼現在可用。 – user781486

+0

我問了一個後續問題。 https://stackoverflow.com/questions/33582172/what-is-the-difference-between-these-2-ways-of-promisifying-a-function – user781486

+0

恩,'Bluebird.promisifyAll'確實遵循'.prototype'鏈接自動,不是嗎? – Bergi