В 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.
@EhsanSajjad, какую версию javascript вы используете?
Возвращают ли асинхронные вызовы f1 и f2 обещание?
@ palañн, нет. Асинхронного нет.
@ ЯрикТроф, я неправильно прочитал, поэтому вы ищете такое же поведение в js
почему мой вопрос был отклонен?
Мне это кажется очень хорошим вопросом, поэтому меня озадачивает, почему за него так много раз отказывали. Кто-то готов уточнить?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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