使用 Bluebird 承诺一个函数
Promisifying a function with Bluebird
我是 javascript 异步概念的新手,具有 C++ 背景。最近,我意识到我的某些功能无法正常工作,因为它们没有 return promises。
比如这个函数;
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;
});
}
如果我尝试根据函数的 return 值分配一个变量,我得到未定义。
var alerts_obj = get_json(testData);
如何将get_json()
修改为return承诺?我想用蓝鸟。我正在阅读有关 promises 的内容,但目前对于初学者来说它实在是太难了。
如果您使用的是蓝鸟,您只需使用 Promisification with 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) }
但是你不能直接把它赋给一个变量,因为它是异步的。
在此处查看此问题和答案以获得更多见解:How to return value from an asynchronous callback function?
我是 javascript 异步概念的新手,具有 C++ 背景。最近,我意识到我的某些功能无法正常工作,因为它们没有 return promises。
比如这个函数;
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;
});
}
如果我尝试根据函数的 return 值分配一个变量,我得到未定义。
var alerts_obj = get_json(testData);
如何将get_json()
修改为return承诺?我想用蓝鸟。我正在阅读有关 promises 的内容,但目前对于初学者来说它实在是太难了。
如果您使用的是蓝鸟,您只需使用 Promisification with 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) }
但是你不能直接把它赋给一个变量,因为它是异步的。 在此处查看此问题和答案以获得更多见解:How to return value from an asynchronous callback function?