【问题标题】:promise/callback hybrid function承诺/回调混合函数
【发布时间】:2020-09-18 09:13:32
【问题描述】:

我正在玩弄 Promise 和回调,想知道如果没有通过回调,编写一个返回 Promise 的函数的正确方法是什么。

我的结果看起来像这样,但我不确定这是否正确(反模式的意思)

const mySuperFunction = function mySuperFunction(data, cb) {

    let wrapper = new Promise((resolve, reject) => {
        setTimeout(() => {

            if (Math.random() >= 0.5) {
                resolve(Date.now());
            } else {
                reject(new Error("Not today..."));
            }

        }, 100);
    });


    if (cb) {

        wrapper.then((result) => {
            cb(null, result);
        }, (error) => {
            cb(error);
        });

    } else {
        return wrapper;
    }

};


mySuperFunction().then((time) => {
    console.log(time)
}).catch((err) => {
    console.log(err);
});


mySuperFunction(null, (err, time) => {
    console.log(err, time)
});

它很简单:创建一个函数并将“工作”代码包装在一个 Promise 中。 如果没有回调传递给我的函数,我返回包装好的承诺。如果通过了回调,我会从 .then(...).catch(...) 包装/调用它

这样可以吗,还是我错过了一些不起作用的特殊情况?

【问题讨论】:

  • 看起来不错。不过,我会将所有这些都转移到可重用的函数中。

标签: javascript promise callback


【解决方案1】:

这样可以吗,还是我错过了一些不起作用的特殊情况?

您的代码有效,但它增加了无用的开销。 promise 消耗的内存比回调多,而且比回调慢。

我会写一些类似的东西

const { promisify } = require('util')

function mySuperFunctionCallback (data, cb) {
  setTimeout(() => {
    if (Math.random() >= 0.5) {
      cb(Date.now())
    } else {
      cb(new Error('Not today...'))
    }
  }, 100)
}

const mySuperFunctionAsync = promisify(mySuperFunctionCallback)

function mySuperFunction (data, cb) {
  if (cb) {
    mySuperFunctionCallback(data, cb)
  } else {
    return mySuperFunctionAsync(data)
  }
}

mySuperFunction().then((time) => {
  console.log(time)
}).catch((err) => {
  console.log(err)
})

mySuperFunction(null, (err, time) => {
  console.log(err, time)
})

【讨论】:

  • 谢谢,但那是我忘记提及的一点。当我可以直接将它包含在函数中时,为什么要使用“extern”包装器/函数?在我看来,您的示例比我的代码开销更大。
  • 我创建的功能比你多。您正在为每个回调接口调用创建一个承诺:这是一个很大的开销,如果您不信任我,您当然可以用基准测试来误导它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2016-06-15
  • 2019-01-15
  • 1970-01-01
  • 2017-08-12
  • 2018-03-31
相关资源
最近更新 更多