承诺与Bluebird合作

Promisifying a function with Bluebird

本文关键字:合作 Bluebird 承诺      更新时间:2023-09-26

我是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,您可以简单地将Promisification与promisifyAll()一起使用:

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) }

但是您不能将它直接分配给变量,因为它是异步的。请参阅以下问答以获得更多见解:如何从异步回调函数返回值?