JQuery, передавая вызов функции в другую функцию и порядок выполнения - PullRequest
5 голосов
/ 13 ноября 2009

У меня есть этот JavaScript:

triggerAnimation(listItem,toggleToggleRadioListItem(listItem));


function triggerAnimation(listItem,passThruFunction){
    listItem.find(".inlineLoading").show();
// pause and then call the toggle function
    $("body").animate({opacity: 1}, 1000, 
    function(){
        alert("a");
    passThruFunction;
    }
    );  
}

function toggleToggleRadioListItem(listItem) {
    alert("b");
};

Что должно произойти:

  • triggerAnimation называется передачей объекта и функции
  • triggerAnimation делает фиктивную анимацию (для создания паузы), затем вызывает предупреждение и запускает функцию обратного вызова, которая выполняет переданную функцию.
  • функция, которая была передана, называется вызовом предупреждения.

Исходя из вышеизложенного, я ожидаю, что предупреждение A появится перед предупреждением B, но это не так. Происходит то, что (кажется) предупреждение B вызывается, как только вызывается triggerAnimation (). Это почему? Как я могу добиться такого поведения?

Ответы [ 4 ]

6 голосов
/ 13 ноября 2009

Вы можете отложить выполнение, передав функцию и вызвав ее позже.

triggerAnimation(listItem, function () {
   toggleToggleRadioListItem(listItem)
});


function triggerAnimation(listItem,passThruFunction){
    listItem.find(".inlineLoading").show();
// pause and then call the toggle function
    $("body").animate({opacity: 1}, 1000, 
    function(){
        alert("a");
        passThruFunction();
    }
    );  
}

function toggleToggleRadioListItem(listItem) {
    alert("b");
};
2 голосов
/ 13 ноября 2009

Ну, вместо этого вы можете передать ссылку на функцию и массив параметров для запуска анимации, которая затем передается в passThruFunction при выполнении. В Javascript то, что вы передаете функции, всегда будет оцениваться до фактического выполнения кода функции, поэтому вы сначала получаете предупреждение ("b"). Это называется оценкой занятости [параметров функции], кстати.

1 голос
/ 13 ноября 2009

ответ eduffy - это самая простая вещь, которая может сработать и сработает. Если вы хотите что-то более хардкорное, тихое чтение частичное применение может дать вам другой метод для добавления к вашему инструментальному поясу.

1 голос
/ 13 ноября 2009

Поскольку вы вызываете toggleToggleRadioListItem(listItem) при вызове triggerAnimation(listItem,toggleToggleRadioListItem(listItem));, то сначала выполняется toggleToggleRadioListItem(listItem).

...