передача jQuery больше параметров в обратный вызов

Вам нужны операторы # и ## и автоматическая конкатенация строк.

Оператор предварительной обработки # превращает параметр макроса в строку. Оператор ## вставляет два токена (например, макропараметры) вместе.

Мне приходит в голову возможность

#define IV_DOMAIN domain.org
#define IV_SECURE(DOMAIN) "secure." #DOMAIN

, которая должна изменить значение IV_SECURE на

#define IV_SECURE "secure." "domain.org"

, которое автоматически объединится в «secure.domain.org» (при условии, что фазы перевода в Си такие же, как и в С ++).

ДРУГОЕ РЕДАКТИРОВАНИЕ: Пожалуйста, прочитайте комментарии, которые показывают, как мне удалось запутаться. Имейте в виду, что я полностью опытен в Си, хотя, возможно, немного ржавый. Я бы удалил этот ответ, но я решил оставить его как пример того, как легко быть запутанным препроцессором Си.

252
задан TylerH 25 November 2016 в 18:48
поделиться

5 ответов

The solution is the binding of variables through closure.


As a more basic example, here is an example function that receives and calls a callback function, as well as an example callback function:

function callbackReceiver(callback) {
    callback("Hello World");
}

function callback(value1, value2) {
    console.log(value1, value2);
}

This calls the callback and supplies a single argument. Now you want to supply an additional argument, so you wrap the callback in closure.

callbackReceiver(callback);     // "Hello World", undefined
callbackReceiver(function(value) {
    callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});

Or, more simply using ES6 Arrow Functions:

callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"

As for your specific example, I haven't used the .post function in jQuery, but a quick scan of the documentation suggests the call back should be a function pointer with the following signature:

function callBack(data, textStatus, jqXHR) {};

Therefore I think the solution is as follows:

var doSomething = function(extraStuff) {
    return function(data, textStatus, jqXHR) {
        // do something with extraStuff
    };
};

var clicked = function() {
    var extraStuff = {
        myParam1: 'foo',
        myParam2: 'bar'
    }; // an object / whatever extra params you wish to pass.

    $.post("someurl.php", someData, doSomething(extraStuff), "json");
};

What is happening?

In the last line, doSomething(extraStuff) is invoked and the result of that invocation is a function pointer.

Because extraStuff is passed as an argument to doSomething it is within scope of the doSomething function.

When extraStuff is referenced in the returned anonymous inner function of doSomething it is bound by closure to the outer function's extraStuff argument. This is true even after doSomething has returned.

I haven't tested the above, but I've written very similar code in the last 24 hours and it works as I've described.

You can of course pass multiple variables instead of a single 'extraStuff' object depending on your personal preference/coding standards.

337
ответ дан 23 November 2019 в 02:52
поделиться

на самом деле ваш код не работает, потому что, когда вы пишете:

$.post("someurl.php",someData,doSomething(data, myDiv),"json"); 

, вы помещаете вызов функции в качестве третьего параметра, а не ссылку на функцию .

0
ответ дан 23 November 2019 в 02:52
поделиться

Вы можете использовать закрытие JavaScript:

function wrapper( var1, var2,....) // put here your variables
{
  return function( data, status)
  {
     //Handle here results of call
  }
};

, а когда можете:

$.post("someurl.php",data,wrapper(var1, var2, etc...),"html");
5
ответ дан 23 November 2019 в 02:52
поделиться

Вы также можете попробовать что-то вроде следующего:

function clicked() {

    var myDiv = $("#my-div");

    $.post("someurl.php",someData,function(data){
        doSomething(data, myDiv);
    },"json"); 
}

function doSomething(curData, curDiv) {

}
8
ответ дан 23 November 2019 в 02:52
поделиться

При использовании doSomething (data, myDiv) вы фактически вызываете функцию и не делаете на нее ссылки.

Вы можете передать doStomething напрямую, но вы должны убедиться, что у нее правильная подпись.

Если вы хотите сохранить doSomething таким, какой он есть, вы можете заключить его вызов в анонимную функцию.

function clicked() {
    var myDiv = $("#my-div");
    $.post("someurl.php",someData, function(data){ 
      doSomething(data, myDiv)
    },"json"); 
}

function doSomething(curData, curDiv) {
    ...
}

Внутри кода анонимной функции вы может использовать переменные, определенные во включающей области. Так работает область видимости Javascript.

81
ответ дан 23 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: