当前位置: 首页 > 知识库问答 >
问题:

promise/回调混合函数

郁和通
2023-03-14

我在玩弄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中。如果没有回调传递给我的函数,我返回包装的promise。如果一个回调被传递,我从包装/调用它。然后(...)。抓住(...)

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

共有1个答案

秦凯旋
2023-03-14

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

您的代码可以工作,但它增加了无用的开销。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)
})

 类似资料:
  • 我试图理解一个API参考描述,但我很难理解它的含义: http://mongodb.github.io/node-mongodb-native/2.2/api/Cursor.html#toArray 上面写着 'toArray(回调)- 我知道回调相当于一个“块”,但有一个指向“promise”的箭头符号意味着什么?

  • 知识点 理解 Promise 概念,为什么需要 promise 学习 q 的 API,利用 q 来替代回调函数(https://github.com/kriskowal/q ) 课程内容 第五课(https://github.com/alsotang/node-lessons/tree/master/lesson5 )讲述了如何使用 async 来控制并发。async 的本质是一个流程控制。其实在

  • 问题内容: 假设我有这段代码 我想知道的是该函数是否将异步执行。 问题答案: 设完成为Call(执行者,未定义,«resolvingFunctions。[[Resolve]],resolvingFunctions。[[Reject]]»)。 如果完成是突然完成,则 令status为Call(resolvevingFunctions。[[Reject]],undefined,«completion。

  • 在上一个小节的学习中,我们了解了 Mixins 作为一个函数时传入参数的使用方法,这个小节我们来介绍下具体介绍下混合函数,以及如何通过 Mixins 传入参数并返回参数。 1. 什么是混合函数? Return variables or mixins from mixins 。——官方定义 慕课解释: Mixins 可以作为一个函数使用返回参数或者一个新的 Mixins 。 在混合函数,返回的参数可

  • 我给出了一个模型以供确认: 下面是显示上述模式的代码。 下面是我如何使用它...(例如在任何视图中) 现在,问题是:如果我调用confirm,它显示模态。但是如果我单击Cancel,然后再次调用confirm(确认),这一次,我点击OK:函数(上面代码段中的第二个参数)被调用两次。如果我点击取消10次,上面的函数调用10次。 知道为什么会这样吗? 谢谢.

  • 问题内容: 如果从调用, 则会 收到消息 “套接字已连接” ,但未调用。我在这里想念什么? 问题答案: 在AngularJS中,承诺结果在$ digest周期内异步传播。因此,仅在进入$ digest循环时才调用在then()中注册的回调函数。 因此,当您的套接字连接时,我们处于摘要周期。 创建一个新的Promise,但是直到下一个摘要周期(永远不会到来的摘要周期)之前,它的结果才会传播(因为没有