2015-11-07 50 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