JavaScript 回调和 Splunk
JavaScript Callbacks and Splunk
我正在使用 Splunk Javascript API 来访问其部分功能,但我无法理解回调背后的 JavaScript 概念。
文档中的示例:
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)
。我的理解是,tasks数组中有5个函数,一个一个执行,一个一个传递结果。
但是我不明白 "done"、"success"、"job" 和 "results" 是如何以及在何处定义的,或者它们是如何用作参数的它们的函数体?
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) { .. }
将第一个函数的结果数据传递给第二个函数?
很抱歉问题很长。
在 Javascript 中,函数创建新范围。这意味着传递的参数在传递给函数之前的命名无关紧要。
var awesomeName = 'bob';
hi(awesomeName);
// name === undefined
function hi(name) {
// name === 'bob';
console.log('hi', name); // Outputs: 'hi bob' in console
}
// name === undefined
如你所说,每个任务调用下一个任务作为回调。 最后一个参数始终是下一个任务 function/callback。这意味着 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);
}
我正在使用 Splunk Javascript API 来访问其部分功能,但我无法理解回调背后的 JavaScript 概念。
文档中的示例:
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)
。我的理解是,tasks数组中有5个函数,一个一个执行,一个一个传递结果。
但是我不明白 "done"、"success"、"job" 和 "results" 是如何以及在何处定义的,或者它们是如何用作参数的它们的函数体?
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) { .. }
将第一个函数的结果数据传递给第二个函数?
很抱歉问题很长。
在 Javascript 中,函数创建新范围。这意味着传递的参数在传递给函数之前的命名无关紧要。
var awesomeName = 'bob';
hi(awesomeName);
// name === undefined
function hi(name) {
// name === 'bob';
console.log('hi', name); // Outputs: 'hi bob' in console
}
// name === undefined
如你所说,每个任务调用下一个任务作为回调。 最后一个参数始终是下一个任务 function/callback。这意味着 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);
}