Node js,重构长node js异步函数
Node js, refactoring long node js async function
我正在将 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);
}
});
}
对我而言,最佳做法是什么?
我会为每个 function (callback) {
创建一个命名函数,然后用新创建的函数名称替换任务数组中的它们。
此外,我会将回调函数包装到 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
}
我正在将 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);
}
});
}
对我而言,最佳做法是什么?
我会为每个 function (callback) {
创建一个命名函数,然后用新创建的函数名称替换任务数组中的它们。
此外,我会将回调函数包装到 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
}