如题.用 js 写接口还是小白,这不,顺序执行的时候发现文件操作,数据库操作都是异步执行.不得不说这一点
node.js 保持了js 其脚本语言最大可能的灵活性,
下面就说说 据说是 node.js 最擅长的. 异步,同步处理.下面以,文件保存"后"读取文件大小信息为例子
说明一下
- 第一个坑:获取文件 的状态信息,首先必需要绝对地址而不是web 相对路径
let path = require('path');
path.resolve("public/civ_image/" + ran_number + "image.jpg")
如果不使用 path.resolve 将相对路径的 文件转换为绝对路径,将导致找不到文件的错误
no such file ....
2.第二坑:写入文件后. 读取文件信息(尺寸)大小 始终是"0" 的,这是因为写文件异步需要时间所以这个处理是和顺序执行异步的
,读取文件的信息和这个操作是非同步的.
读取文件信息的时候文件还没用写入.所以文件尺寸是零,要得到文件大小,必需等待,必需与写入文件处理,同步,写完文件后
再读取文件信息(大小)
*由于对js 语法不数量,花了点时间,(光看语法不行还是得多测试)
下面就说说同步node.js async模块,如何 保持执行的的顺序逻辑!
任务= [ 执行体1->,执行体2]
async.waterfall(任务)
当然它还有很多种其他的方式.
var tasks_2=[
function (callback) {
fs.writeFile("public/civ_image/" + ran_number + "image.jpg", dataBuffer, function (err) {
if (err) {
resultStr2 = {
success: '9',
message: '保存文件失败'
}
} else {
resultStr2 = {
success: '8',
message: '正确保存文件'
}
}
callback(err)
});
},function (callback) {
fs.stat(path.resolve("public/civ_image/" + ran_number + "image.jpg"),function (err,stats) {
console.log("文件长度:" +stats.size) ;
});
}
];
async.waterfall(tasks_2, function(err, results) {
if(err)
{
console.log("文件长度读取错误:" +err.message) ;
}
});
虽然说这种机制.解决了同步问题,总是感觉.好眼花缭乱.
我习惯了.结构化顺序这样看起来好乱,这方面确实有待自我反省.
- 数据库的操作,逻辑上,几个查询先后在逻辑上,需要对异步的查询进行同步.
目标: 我的查询先后顺序上要利用前一个查询结果逻辑处理后,传递一个参数作为下一个查询的前提条件,
所以必需要保持顺序执行的的逻辑,后一个查询必需等待.前一个查询顺利结束.
下面的片段很长所以只是截取了一段.原理和上面写文件差不多.只是需要传递参数.
}, function(callback) {
/***********************
* 管理卡 读取
* 查询有 session登录 权限
***********************/
if (req.session.hasOwnProperty("user")) {
connection.query('SELECT * FROM towncardrank WHERE town_card_rank_to_civ_id=?', req.session.user.id, function(err, result) {
callback(err, result[0].town_card_rank_number);
});
}
}, function(town_card_rank_number, callback) {
/***************
* 下面检查 操作数据和登录的权限匹配
* 或者具有管理权限的才能登录
***************/
if(req.session.hasOwnProperty("user") ||town_card_rank_number===10) {
callback(err, result[0].town_card_rank_number); 这个回调的传递的参数被下一个执行体 使用
function(town_card_rank_number, callback)
这个 result[0].town_card_rank_number 对应 town_card_rank_number 值是传递的.参数
吐槽
*都说x 如何如何不如xxxx ,xx如何好,其实久了都一样.堆叠起来,还不是山一样高.
人解读代码的还是顺序的.就像开车,操作上似乎比脚踏车自由度多几个,殊不知自由度,直升机还更高,
操作上,真正能解决人的负担的.只有AI ,不过这样一来.也就失去了.直接操作意义,
以前面朝黄土背朝天,现在,借助机器,有效率有,成果,只能感叹一去不复返了.