gpt4 book ai didi

javascript - 修改 NodeJS 中的 Promise 原型(prototype)

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:48 24 4
gpt4 key购买 nike

基本说明:我正在编写一个包装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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com