与Bluebird一起宣传功能

时间:2015-11-07 00:22:40

标签: javascript node.js promise bluebird

我是javascript异步概念的新手,来自C ++背景。最近,我意识到我的一些功能不起作用,因为它们没有返回承诺。

例如,这个函数;

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()以返回承诺?我想用Bluebird。我正在阅读承诺,但对于一个初学者来说,这是非常压倒性的。

1 个答案:

答案 0 :(得分: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?