我将SQL过程转换为节点js函数。
我的转换功能太长,可读性差。
我想拆分小功能,但不知道如何重构它。 我使用async.wait,因为几个SQL语句应该是串行运行的。
exports.cancelDansok = function cancelDansok(dansokSeqNo, callback) {
var tasks = [
function (callback) {
models.DansokHist.max('SerialNo', {
where: { DansokSeqNo: dansokSeqNo}
})
.then(max => {
if (!max) {
callback(null, 1);
} else {
callback(null, max+1);
}
})
.error(err => {
log.info(err);
return callback({status:400, message:'select dansokhisttbl failed.'});
});
},
function (serialNo, callback) {
....
})
.then(() => {
....
})
.then( feeVBankList => {
callback(null);
})
.error(err => {
return callback({status:400, message:'update dansokfeetbl failed.'});
});
},
function (callback) {
....
},
function (callback) {
....
},
function (callback) {
....
},
function (callback) {
....
}
];
async.waterfall(tasks, function(err, success) {
if (err) {
return callback(err);
} else {
return callback(success);
}
});
}
在我的案例中,最佳做法是什么?
答案 0 :(得分:1)
我将为每个function (callback) {
创建一个命名函数,然后通过新创建的函数名称在tasks数组中替换它们。
另外,我将回调函数包装到Promises
并使用Promise.all
。
示例:
/**
* I love cats!
*/
function loveCats() {
return new Promise((resolve, reject) => {
models.DansokHist.max('SerialNo', {
where: { DansokSeqNo: dansokSeqNo }
})
.then(max => resolve(!max ? 1 : max + 1))
.error(err => reject({
status: 400,
message: 'select dansokhisttbl failed.',
}));
});
}
/**
* I love dogs!
*/
function loveDogs() {
// ...
}
Promise.all([
loveCats,
loveDogs,
...
])
.then((allRets) => {
// Handle the rets
})
.catch((err) => {
// Handle the errors
});
更好的是,您可以使用新支持的功能async/await
。
/**
* I love cats!
*/
function loveCats() {
return new Promise((resolve, reject) => {
models.DansokHist.max('SerialNo', {
where: { DansokSeqNo: dansokSeqNo }
})
.then(max => resolve(!max ? 1 : max + 1))
.error(err => reject({
status: 400,
message: 'select dansokhisttbl failed.',
}));
});
}
/**
* I love dogs!
*/
function loveDogs() {
// ...
}
try {
const allRets = await Promise.all([
loveCats,
loveDogs,
...
]);
// Handle the rets
} catch (err) {
// Handle the errors
}