node默认是异步执行的,
这也是他赖以生存的根本,
是效率高的本源。
但是,有的时候,我们希望代码是同步执行的,因为下面的执行任务用到前一步的结果。
别怕,有一些方式可以实现同步,
比如:promise,之前使用的是node4版本,先说node4版本的情况。
promise可以使用链式的方式,将功能的处理按照顺序执行。
那么如果遇到这样一个场景:
1.需要使用promise进行同步的链式操作;
2.有多条数据(不固定多少条),按照顺序一条一条存入数据库;
如何处理呢?
其实这种处理就是一个递归操作。
处理方式:
//保存一条数据到db
saveOne: function(dummy) {
return new Promise(resolve, reject) {
//保存dummy数据到db
dummy = new models.Dummy(dummy);
dummy.save(function(err) {
if(err) { return resolve({status:1, message: err.stack });}
else { return resolve({status:0, message: 'OK'}); }
});
}
},
//将数组中的数据,一条一条保存到数据库中
//通过调用saveOneByOneWithCallback来实现一个接一个的保存数据;
//传递的回掉函数,就是saveOneByOne的return,
//因此,实现了外部调用此方法,既是promise的方式,又实现了功能
saveOneByOne: function(dummies) {
return new Promise(function(resolve, reject) {
dummies = dummies || [];
//var _ = require('lodash');
dummies = _.isArray(dummies) ? dummies : [ dummies ];
saveOneByOneWithCallback(dummies, undefined, function(result) {
return resolve({status: 0, data: result});
});
});
},
//通过不断的循环调用,实现一个接一个的保存
//最后通过cb返回执行结果;
saveOneByOneWithCallback: function(dummies, result, cb) {
dummies = dummies || [];
result = result || [];
if(dummies.length > 0) {
var dummy = dummies[0];
saveOne(dummy).then(function(saveResult) {
result.push(saveReuslt);
if(dummies.length > 1) {
dummies = dummies.slice(1);
saveOneByOneWithCallback(dummies,result,cb);
}
});
}
}
PS: 其实这个还有一个方式,那就是将数据在保存到数据库之前进行从1开始的编号,
如果是数据库有数据的情况,就要先查询数据库中的最大的数据,然后+1开始编号,
使用编号的不好的方式,在于数据可能会有删除,
不管使用物理删除还是软删除,编号要么重新排序,要么就会有断层。
而使用这种方式的话,默认就根据id进行排序,id是包含了时间的有序的值。
就比较方便了。
当然了,node4的版本太老了,现在的新项目基本都是使用node8+,
之前的老的项目,其实也需要使用新的版本进行重构了。
那么,在node8+的项目中,如何使用呢?
async/await就可以完美的解决这种问题,并且是非常优雅的解决。
示例如下:
const { once, EventEmitter } = require('events');
async function run() {
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.log('error happened', err);
}
}
run();
示例来源: