一个有关异步操作的问题,弄了一天,没明白。
很简单的一个需求: 前端post一个对象过来,要保存进数据库,比如是{name:‘name1’, val:‘val2’}, 后端需要做2件事情,一是在主数据库保存这个obj,二是在备份数据库保存这个obj。 后端分2层,一个是逻辑层,一个是数据层,专门操作数据库的,逻辑层用RPC和数据层通讯。 逻辑层其实也是简单的发送那个obj过去,都很平常。 问题在数据层,我的数据层的主备数据库实际上是1份代码运行的2份实例(分配不同的port),而在只是在代码中做判断, 若这个实例是设置为备份数据库,则只写入备份数据库即可。 若这个实例是设置为主数据库的,则要在写入主数据库后,RPC发送obj给备份数据库,让它也写入备份数据库。
co(function*() {
let _promises = [];
_promises.push(couponInsert(json));
if (isMainServer) {
let client = jayson.client.tcp({
port: 5001
});
_promises.push(client.request('xix/adminCouponInsert', json));
}
let _count = yield _promises;
cb(null, _count);
}).catch(function (err) {
console.log('backError:' + JSON.stringify(err));
cb(null, null);
});
然而,所有的备份数据库,接收到的obj都是null。 我试了各种方法,包括setTimeout、yield [], co-any,都是这样,现在整个人都晕了。
2 回复
后面发现,即使我_promises.push(client.request(‘xix/adminCouponInsert’, {a:1,b:1})); 再后来,解决了。。。 是那个库必须要限定字段的名称,不对的字段就直接null。。。蛋痛啊
结贴