【问题标题】:Promisifying a function with Bluebird用 Bluebird 承诺一个功能
【发布时间】:2016-02-08 05:46:42
【问题描述】:

我是 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() 以返回承诺?我想用蓝鸟。我正在阅读 Promise,但目前对于初学者来说相当难以接受。

【问题讨论】:

    标签: javascript node.js promise bluebird


    【解决方案1】:

    如果您使用的是 bluebird,您可以简单地将 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?

    【讨论】:

    • 谢谢!赞成。看起来确实很有希望。我可以 promisifyAll 任何 node.js 模块吗?在promisifyAll之后,我是否必须为每个使用promisifyAll模块的函数使用这个.then和.catch结构?
    • 请问如何使用新的get_json(),它返回一个promise并将其分配给一个变量?
    • 您可以 promisifyAll most/many modules,请参阅我在上面发布的第一个链接,了解如何做到这一点。不过,有时您必须使用原型。你不必使用 then 和 catch,尽管你应该
    • @user768421 之前没用过csv2json,可能你要用fromStringAsync()...
    • 已选择您的答案作为答案。你是最有帮助的!
    猜你喜欢
    • 2015-10-23
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2018-02-01
    • 2014-07-15
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多