首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >promise/callback混合函数

promise/callback混合函数
EN

Stack Overflow用户
提问于 2020-09-18 17:13:32
回答 1查看 34关注 0票数 0

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

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

代码语言:javascript
复制
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中。如果没有回调传递给我的函数,我将返回包装好的promise。如果传递了一个回调,我会从.then(...).catch(...)包装/调用它

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

EN

回答 1

Stack Overflow用户

发布于 2020-09-18 22:58:31

这样可以吗,或者我错过了一些特殊情况,在这些情况下,这种方法不起作用?

您的代码可以工作,但它增加了无用的开销。promise比回调消耗更多的内存,而且比回调慢。

我会写下这样的东西

代码语言:javascript
复制
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)
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63952807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档