Возникли проблемы с обещанием неясной библиотеки, а затем ее использованием в сопрограмме
Итак, я пытаюсь обещать библиотеку splunk-sdk, но, похоже, я не понимаю, как работает promisifying, по крайней мере, с coroutines.
Примечание: Я использую bluebirdjs
Вот процесс, который я пытался воссоздать в сопрограмме:
// Search everything and return the first 100 results
var searchQuery = "search * | head 100";
// Set the search parameters
var searchParams = {
exec_mode: "blocking",
earliest_time: "2012-06-20T16:27:43.000-07:00"
};
// A blocking search returns the job's SID when the search is done
console.log("Wait for the search to finish...");
// Run a blocking search and get back a job
service.search(
searchQuery,
searchParams,
function(err, job) {
console.log("...done!n");
// Get the job from the server to display more info
job.fetch(function(err){
// Display properties of the job
console.log("Search job propertiesn---------------------");
console.log("Search job ID: " + job.sid);
console.log("The number of events: " + job.properties().eventCount);
console.log("The number of results: " + job.properties().resultCount);
console.log("Search duration: " + job.properties().runDuration + " seconds");
console.log("This job expires in: " + job.properties().ttl + " seconds");
// Get the results and display them
job.results({}, function(err, results) {
var fields = results.fields;
var rows = results.rows;
for(var i = 0; i < rows.length; i++) {
var values = rows[i];
console.log("Row " + i + ": ");
for(var j = 0; j < values.length; j++) {
var field = fields[j];
var value = values[j];
console.log(" " + field + ": " + value);
}
}
})
});
}
);
Его из этого учебника
Вот к чему привели мои усилия (каламбур частично задуман?)
"use strict";
//Get the splunk sdk
var splunkjs = require('splunk-sdk');
//get promise dependencies
Promise = require("bluebird");
//get request dependencies
var request = require('request-promise');
//Promisify dependencies
splunkjs = Promise.promisifyAll(splunkjs);
//create a promise generator
exports.splunkTest = Promise.coroutine(function*(){
try{
// Create a Service instance and log in
let service = yield Promise.promisifyAll(Promise.resolve(new splunkjs.Service({
username:"user",
password:"password",
scheme:"https",
host:"host",
port:"8089",
version:"6.3.2"
})));
// Pass the search query
let searchQuery = "search * | head 100";
let searchParams = {
exec_mode: "blocking"
};
let job = yield Promise.resolve(service.search(searchQuery,searchParams,function(err,job){return console.log("running");return job;}));
//JOB DOESN'T CONTAIN FUNCTIONS!!! :(
return yield Promise.resolve(job);
} catch (e){
console.log(e)
}
});
Объект задания не имеет никакой функции в моей, вероятно ошибочной, попытке преобразовать процесс в сопрограмму.
Может ли кто-нибудь предложить какое-то общее руководство?
1 ответ:
Конструктор
splunkjs.Service
не будет возвращать обещание, поэтому вам не нужно его возвращать. Вы действительно хотите запуститьpromisifyAll
на нем, чтобы обещать все его методы.Итак:
Далее вы хотите вызвать обещанную версиюlet service = Promise.promisifyAll(new splunkjs.Service({...}));
search
, которая будет называтьсяsearchAsync
. Поскольку это возвратит обещание, вы его дадите (и вы не передадите обратный вызов);let job = yield service.searchAsync(...);
Наконец, вы просто возвращаете то, что хотите вернуть:
return job;