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

标签 javascript node.js es6-promise

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

相关文章:

javascript - 如何使用map函数正确显示多个Flatlist?

node.js - 如何使用 VueJS 保存用户 session ?

javascript - react promise : TypeError: Cannot read property 'then' of undefined

javascript - anchor 标签内的 Font Awesome 图标不可点击。有没有办法做到这一点?

javascript - 如何在 react 中显示两个节点之间的标签?

node.js - 如何使用机器人框架中的每条消息创建和发送反向 channel 事件?

mysql - Node.js:数据库查询+多部分表单数据锁定

javascript - 如何在 JavaScript es6 中代理 Promise

javascript - 如何在 promise 解决时处理 promise ?

javascript - 手动突出显示 javascript 中的特定部分 SyntaxHighlighter