Detect if it’s inside a callback?

Asked

Viewed 53 times

0

Basically I want a function to behave differently if it is inside a callback. See the example:

import Test from './test ;'

Test.say('Olá!'); // Deve imprimir: "Olá!"

Test.group(() => {
  Test.say('Ei!'); // Deve imprimir: "Ei! - Dentro do grupo."

  Test.say('Ei, como vai?'); // Deve imprimir: "Ei, como vai? - Dentro do grupo."
});

Test.say('Olá, como vai?'); // Deve imprimir: "Olá, como vai?"

Aquivo test.js:

export default class Test {
  say(word) {
    // Se estiver dentro do grupo:
    if (estiverDentroDoGrupo) {
      return console.log(`${word} - Dentro do grupo.`);
    }

    console.log(word);
  }

  group(callback) {
    callback();
  }
}
  • 1

    The fact that you need this is a sign of an architectural problem in your application. "Solutions" involve gambiarras and the result is a greater coupling in your code. I would rethink the need for this.

1 answer

0


First, it has to be said that magic does not exist. And the possibilities of a solution are as many as imagination allows.

Where you have no competition and asynchronous, a solution that you don’t need to change the main.js can be this:

let inGroup = false;

export default class Test{
  say(word) {
    // Se estiver dentro do grupo:
    if (inGroup) {
      return console.log(`${word} - Dentro do grupo.`);
    }

    console.log(word);
  },

  group(callback) {
    inGroup = true;
    callback();
    inGroup = false;
  }
}

Other options involve getting the name of the function you called say, emulating what arguments.calle.caller did in the ancient JS.

main js

const Test = require('./test');

Test.say('Olá!'); // Deve imprimir: "Olá!"

Test.group(function() {
  Test.groupSay('Ei!'); // Deve imprimir: "Ei! - Dentro do grupo."

  Test.groupSay('Ei, como vai?'); // Deve imprimir: "Ei, como vai? - Dentro do grupo."
});

Test.say('Olá, como vai?'); // Deve imprimir: "Olá, como vai?"

test js.

module.exports = {
  say,

  groupSay() {
    return say.apply({ inGroup: true }, arguments);
  },

  group(callback) {
    setTimeout(callback, 100);
  }
}

function say(word) {
  // Se estiver dentro do grupo:
  if (this.inGroup) {
    return console.log(`${word} - Dentro do grupo.`);
  }

  console.log(word);
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.