基本说明:我正在编写一个包装nodeJS mysql函数的类。在该类中,我有一个选择函数,用于创建要运行的查询。我正在返回一个 Promise,这样我就可以轻松使用 .then 和 .catch 功能。
问题:是否有比我这里的基本设置更好的添加 .before 函数的方法?或者修改 Promise 有缺点吗?
function beforePromise(add){
var before = [];
var p = new Promise(function(resolve){
if(typeof add !== "number"){
throw new Error("argument 'add' is not a valid number.");
}
var number = 0;
number += add;
setTimeout(function(){
for(var i = 0; i < before.length; i++){
number = before[i](number);
}
// get the query from database
// resolve
resolve(number);
}, 0);
});
// add the .before function
p.before = function(callback){
if(typeof callback === "function"){
before.push(callback);
}
return p;
};
return p;
}
beforePromise(10)
.before((num) => num * 1.2) // num = 12
.before((num) => num + 2) // num = 14
.then(num => console.log(num))// output 14
.catch((err) => console.error(err));
beforePromise(10)
.then((num) => console.log(num));// output 10
/*
beforePromise()
.then((num) => console.log(num))
.catch(err) => console.log(err));
*/
最佳答案
修改 Promise 不是主要问题,而是 setTimeout
引入的潜在意外行为。
如果我读了代码:
beforePromise(10)
.before((num) => num * 1.2) // num = 12
.before((num) => num + 2) // num = 14
.then(num => console.log(num))// output 14
.catch((err) => console.error(err));
那么对我来说,不清楚我是否被允许做这样的事情
var obj = beforePromise(10)
var val = await someAsyncTask()
obj = obj.before((num) => num * val)
obj = obj.before((num) => num + 2)
obj.then(num => console.log(num))// output 14
.catch((err) => console.error(err));
这不会产生预期的结果。因此,您需要在文档中描述这一点,并且代码的维护者/审阅者需要知道这一点或在文档中查找这一点。
更好的方法是使用一个显式函数来触发该进程的执行。
before(10)
.before((num) => num * 1.2) // num = 12
.before((num) => num + 2) // num = 14
.exec() // does returns the Promise and does the execution
.then(num => console.log(num)) // output 14
.catch((err) => console.error(err));
function before(add) {
var callbacks = [];
var obj = {
before: before,
exec: exec
}
function before(callback) {
if (typeof callback === "function") {
callbacks.push(callback);
}
return obj;
}
function exec() {
if (typeof add !== "number") {
throw new Error("argument 'add' is not a valid number.");
}
var number = 0;
number += add;
for (var i = 0; i < callbacks.length; i++) {
number = callbacks[i](number);
}
return Promise.resolve(number)
}
return obj
}
before(10)
.before((num) => num * 1.2) // num = 12
.before((num) => num + 2) // num = 14
.exec()
.then(num => console.log(num)) // output 14
.catch((err) => console.error(err));
before(10)
.exec()
.then((num) => console.log(num)); // output 10
关于javascript - 修改 NodeJS 中的 Promise 原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51538816/