Передача функции в качестве аргумента в Javascript - PullRequest
2 голосов
/ 11 ноября 2011

Я действительно борюсь с этим - уверен, что мне не хватает чего-то простого.

Вот код: -

function webcamupdate(webcamurl) {
    alert("I am a function to update the webcam with the url "+webcamurl);
}

function countdown(callback) {
    alert(callback);
    setTimeout("callback()", 10000);
}

var theurl = "THIS IS THE URL";

countdown(function(){ webcamupdate(theurl); });

Как видите, я пытаюсь создать функцию обратного отсчета (кода больше, однако я только что опубликовал основы), который через 10 секунд запустит функцию (в данном случае обновление веб-камеры).

Все работает нормально, если у функции нет аргументов, однако предупреждение (обратный вызов) в функции coundown возвращает следующее: -

function () {webcamupdate (theurl); }

Это, конечно, приводит к аварийному завершению сценария, когда функция веб-камеры обновляется, так как «веб-камера» не определена.

Что фактически нужно сказать (обратный вызов): -

function () {webcamupdate («ЭТО URL»); }

т.е.. он оценивает аргумент "theurl" ПЕРЕД передачей его с функцией.

Любые идеи будут высоко оценены

EDIT

Я думаю, что, возможно, я ввел вас в заблуждение тем, что использовал предупреждение, а не функцию (я просто пытался сделать это простым!)

Вот оригинальный код (все еще сокращен, но дает вам лучшее представление).

function webcamupdate(url) {
    document.getElementById("cruisecam").src=url+"&rand="+Math.random();
    countdown(30,"Webcam",function(){ webcamupdate(url); });
}

function countdown(currentcount,displayelement,callback) {
    var displaytext;
    if (currentcount == 0 ) displaytext = displayelement+" is refreshing now";
    else displaytext = displayelement+" updating in "+currentcount+" seconds";
    if (trackingcountdown.hasChildNodes()) clearelement("trackingcountdown");
    trackingcountdown.appendChild(document.createTextNode(displaytext));
    if (currentcount == 0) {
        countdown(currentcount,displayelement,callback)
    }
    else {
        currentcount--;
        var countdownparameters=currentcount+',"'+displayelement+'",'+callback;
        setTimeout("countdown("+countdownparameters+")", 1000);
    }
}

//The function is called on window loading with
//countdown(30,"Webcam",function(){ webcamupdate(url); });

//clearelement is another function (not listed) that clears the node.

По сути, важна функция обратного отсчета - для этого требуется 3 аргумента - время обратного отсчета в секундах, элемент DOM для отображения обратного отсчета и функция, запускаемая по таймауту.

Если третий аргумент (функция) не имеет собственных аргументов - например, webcam () - работает нормально, однако, когда мы пытаемся добавить веб-камеру ("webcampic.jpg"), она не работает из-за функции, которая пытается запустить веб-камеру (url), а не веб-камеру ("webcampic.jpg").

Очевидно, что самое простое решение - просто сделать URL-адрес глобальной переменной, но это не очень хорошая практика, и я бы не стал использовать код обратного отсчета на других страницах через файл js. помощь!

Ответы [ 3 ]

3 голосов
/ 11 ноября 2011

Просто перейти с callback() на передачу ссылки на функцию.

function webcamupdate(webcamurl) {
    alert("I am a function to update the webcam with the url "+webcamurl);
}

function countdown(callback) {
    alert(callback);
    setTimeout(callback, 10000);
}

var theurl = "THIS IS THE URL";

countdown(function(){ webcamupdate(theurl); });
0 голосов
/ 21 ноября 2011

Ок, ребята, я наконец-то решил это сам, вот решение для других.

Сначала создайте функцию, которая возвращает функцию:

function createfunctionwebcamupdate(url) {
    return function(){ webcamupdate(url); };
}

Затем установите для переменной значениевызовите функцию, когда она вызывается:

webcamupdatefunction = createfunctionwebcamupdate(url);

Затем обратитесь к этой новой переменной как к функции обратного вызова:

function(){ webcamupdatefunction(); }

Javascript, очевидно, запоминает переменную, сохраненную в части createfunction, когдапеременная называется.

Надеюсь, это поможет.

0 голосов
/ 11 ноября 2011
var theURL = "THIS IS THE URL";

function webCamUrlUpdate( url ) {
    alert( "I am a function to update the webcam with the url " + url );
}

function countDown( callback ) {
    setTimeout( callback, 10000 );
    alert( callback );
}

countDown(function () {
    /* IMPORTANT: need to return that other function */
    return webCamUrlUpdate( theURL );
});

Вы на самом деле захотите вернуть функцию, чтобы setTimeout( callback, 10000 ); вел себя как ожидалось.Когда вы уведомляете функцию в Javascript, это то же самое, что и alert(callback.toString()), чтобы получить полную строковую версию заголовка и тела функции.

http://jsfiddle.net/btleffler/xJ5uw/

Интересно, что если вы предупредитеобратный вызов до setTimeout(), похоже, что обратный вызов никогда не срабатывает.Если вы закомментируете первое оповещение или оповещение после установки времени ожидания, оно работает просто отлично.Я только что проверил это в Chrome, поэтому я должен сделать еще несколько исследований, я полагаю.

В любом случае, вы не можете иметь разбор javascript (или обрабатывать или что-то еще) параметр функции перед функциейна самом деле называется.Вы можете просто использовать анонимный обратный вызов в countDown(), хотя он будет предупреждать URL самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...