2015-07-01 1 views
0

Я использую API-интерфейс Splunk Javascript для доступа к некоторым его функциям, но у меня возникли проблемы с пониманием концепций JavaScript для обратных вызовов.JavaScript Callbacks and Splunk

пример из документации:

var http = new splunkjs.ProxyHttp("/proxy"); 
var service = new splunkjs.Service(http, { 
    username: username, 
    password: password, 
    scheme: scheme, 
    host: host, 
    port: port, 
    version: version 
}); 

Async.chain([ 
     // First, we log in 
     function(done) { 
      service.login(done); 
     }, 
     // Perform the search 
     function(success, done) { 
      if (!success) { 
       done("Error logging in"); 
      } 

      service.search("search index=_internal | head 3", {}, done); 
     }, 
     // Wait until the job is done 
     function(job, done) { 
      Async.whilst(
       // Loop until it is done 
       function() { return !job.properties().isDone; }, 
       // Refresh the job on every iteration, but sleep for 1 second 
       function(iterationDone) { 
        Async.sleep(1000, function() { 
         // Refresh the job and note how many events we've looked at so far 
         job.fetch(function(err) { 
          console.log("-- fetching, " + (job.properties().eventCount || 0) + " events so far"); 
          iterationDone(); 
         }); 
        }); 
       }, 
       // When we're done, just pass the job forward 
       function(err) { 
        console.log("-- job done --"); 
        done(err, job); 
       } 
      ); 
     }, 
     // Print out the statistics and get the results 
     function(job, done) { 
      // Print out the statics 
      console.log("Job Statistics: "); 
      console.log(" Event Count: " + job.properties().eventCount); 
      console.log(" Disk Usage: " + job.properties().diskUsage + " bytes"); 
      console.log(" Priority: " + job.properties().priority); 

      // Ask the server for the results 
      job.results({}, done); 
     }, 
     // Print the raw results out 
     function(results, job, done) { 
      // Find the index of the fields we want 
      var rawIndex  = utils.indexOf(results.fields, "_raw"); 
      var sourcetypeIndex = utils.indexOf(results.fields, "sourcetype"); 
      var userIndex  = utils.indexOf(results.fields, "user"); 

      // Print out each result and the key-value pairs we want 
      console.log("Results: "); 
      for(var i = 0; i < results.rows.length; i++) { 
       console.log(" Result " + i + ": "); 
       console.log(" sourcetype: " + results.rows[i][sourcetypeIndex]); 
       console.log(" user: " + results.rows[i][userIndex]); 
       console.log(" _raw: " + results.rows[i][rawIndex]); 
      } 

      // Once we're done, cancel the job. 
      job.cancel(done); 
     } 
    ], 
    function(err) { 
     callback(err);   
    } 
); 

Async.chain определяется here как root.chain = function(tasks, callback). Я понимаю, что в массиве задач есть 5 функций, которые выполняются один за другим и передают результаты от одного к другому.

Однако я не понимаю, как и где «сделаны», «успех», «работа» и «результаты» определены или как они используются в качестве аргументов внутри тела их функций?

function(success, done) { 
      if (!success) { 
       done("Error logging in"); 
      } 

      service.search("search index=_internal | head 3", {}, done); 
    } 

здесь, как оно проходит тестирование против успеха и передачи строки в done()?

и как эти две функции

function(job, done) {// Print out the statics ..} 
& 
function(results, job, done) { .. } 

передать данные результатов от первой функции на второй?

Извинения за длинный вопрос.

ответ

1

В Javascript функции создают новую область. Это означает, что не имеет значения, какие переданные аргументы были названы до того, как они были переданы функции.

var awesomeName = 'bob'; 

hi(awesomeName); 

// name === undefined 

function hi(name) { 
    // name === 'bob'; 
    console.log('hi', name); // Outputs: 'hi bob' in console 
} 

// name === undefined 

Как вы сказали, каждая задача вызывает следующую задачу в качестве обратного вызова. Последний аргумент всегда является следующей функцией функции/обратным вызовом. Это означает, что Async.chain, вероятно, автоматически добавляет обратные вызовы в конец аргументов перед вызовом каждой функции задачи. done - это просто условное имя для назначения обратного вызова. Аналогичным образом, другие аргументы являются просто описательными именами аргументов, переданных предыдущей задачей. Чтобы понять, почему они названы таким образом, вы должны посмотреть на функцию, вызывающую обратный вызов.

Например:

service.login(done), вероятно, имеет какой-то код в нем, что делает что-то вроде этого:

login: function(callback) { 
    var successful; 

    // Do Login logic here and assign true/false to successful 

    callback(successful); 
} 

Обратный вызов является следующей задачей в цепи и имеет два аргумента, success и done , success - это только первый аргумент, который передал ему login. Async.chain всегда передает другой аргумент в качестве последнего аргумента: следующая функция задачи, которой по назначению присвоено имя done. Вы можете называть его любым, что вы хотите, в каждой функции, если вы ссылаетесь на него как одно и то же имя внутри функции.

function cb(success, fuzzyCallback) { 
    if (!success) { 
    fuzzyCallback('Error!'); 
    } 

    fuzzyCallback(null); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^