Добавляйте обратные вызовы в javascript так же, как в C#

В C# я могу делать следующее:

public delegate void Callback();

void f1() {

}

void f2() {

}

Callback c = f1;
c+=f2;

А потом, когда я позвоню c(), мне позвонят f1 и f2.

Как я могу добиться того же результата в javascript?

Я имею в виду, что могу сделать в javascript следующее:

var c;

function f1() {

}

function f2() {

}

c = f1;

Но я не могу добавить f2 в c.

вы пробовали запустить код? это работает так, как будто ты спрашиваешь

Ehsan Sajjad 20.03.2018 16:14

@EhsanSajjad, какую версию javascript вы используете?

hellomates 20.03.2018 16:16

Возвращают ли асинхронные вызовы f1 и f2 обещание?

palaѕн 20.03.2018 16:16

@ palañн, нет. Асинхронного нет.

hellomates 20.03.2018 16:17

@ ЯрикТроф, я неправильно прочитал, поэтому вы ищете такое же поведение в js

Ehsan Sajjad 20.03.2018 16:18

почему мой вопрос был отклонен?

hellomates 20.03.2018 17:09

Мне это кажется очень хорошим вопросом, поэтому меня озадачивает, почему за него так много раз отказывали. Кто-то готов уточнить?

Wim Bokkers 20.03.2018 20:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
109
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

var t = function(callback){
// do stuff
callback();
}

function callbackFuction(){
// this is your callback fucntion
}

function diffrentFuntion(){
   t(callbackFuction);
}

надеюсь, что это ответит на ваш вопрос

Это называется многоадресным делегатом, и я не уверен, что есть прямой способ представить это в JavaScript. Но нашел вот этот статья о реализации многоадресных делегатов в JavaScript.

Нет, не можешь. В JavaScript нет концепции делегатов C#.

Используя jQuery, вы можете добиться чего-то похожего, но не того же:

var c = $({});

function a() { console.info('a called!'); }

function b() { console.info('b called!'); }

c.on('fire', a);
c.on('fire', b);

c.trigger('fire'); // calls both event handlers
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Если тебе это подходит ...

Или можете реализовать самостоятельно, это несложно:

function Delegate() {
  this.callbacks = [];
}

Delegate.prototype.add = function(fn) {
  if (typeof fn === 'function' && this.callbacks.indexOf(fn) === -1) {
    this.callbacks.push(fn);
  }
};

Delegate.prototype.remove = function(fn) {
  var index = this.callbacks.indexOf(fn);
  this.callbacks.splice(index, 1);
};

Delegate.prototype.trigger = function() {
  var args = arguments;
  this.callbacks.forEach(function(fn) {
    fn.apply(null, args);
  });
};

// so

var d = new Delegate();

var f1 = function(arg) { console.info('f1', arg); };
var f2 = function(arg) { console.info('f2', arg); };
var f3 = function(arg) { console.info('f3', arg); };

d.add(f1);
d.add(f2);
d.add(f3);

d.trigger('param'); // executes the three callbacks passing them the parameter

// remove one of the callbacks;
d.remove(f2);
// add a repeated callback
d.add(f1);

d.trigger('again');  // only f1 and f3 are fired.

этот класс делегата действует так же, как делегаты C#, насколько это возможно

Ответ принят как подходящий

Вот еще один пример. Это может или не может соответствовать вашим потребностям, но, возможно, вы можете изменить его, чтобы делать то, что вы хотите.

По сути, вы создаете объект, содержащий массив ссылок на функции. Когда вы вызываете .apply() для объекта, он вызывает все функции в том порядке, в котором вы их добавляли.

function delegate(fn){
    this.callbacks = [];
    this.add(fn);
}
delegate.prototype.add = function(fn){
    if (typeof fn === "function"){
        this.callbacks.push(fn);
    }
}
delegate.prototype.apply = function(){
    for(var i in this.callbacks){
        this.callbacks[i].apply();
    }
}


// example

// define callbacks
function cb1() { console.info('callback 1'); }
function cb2() { console.info('callback 2'); }

// create delegate with first callback
var callback = new delegate(cb1);
// add second callback
callback.add(cb2);
// call delegates
callback.apply();
stackoverflow.com/questions/500504/…
georg 20.03.2018 17:18

Конечно, это не самый эффективный вариант, но мы говорим о 2-5 итерациях? Некоторые другие ошибки с for-in здесь не применяются, потому что массив создается и заполняется в этом классе. Разработчики не могут манипулировать им вне класса. Я поддерживаю здесь использование for-in, хотя, взглянув на него еще раз, я думаю, что, вероятно, поменял бы его на this.callbacks.forEach().

AndrewR 21.03.2018 14:58

Другие вопросы по теме