2016-08-03 3 views
2

그래서 splunk-sdk 라이브러리를 약속하려고합니다.하지만 적어도 coroutines와 관련하여 promisifying가 어떻게 작동하는지 이해하지 못하는 것 같습니다.모호한 라이브러리를 약속하는 데 어려움을 겪고 나서 코 루틴에서 사용하는 경우

참고 :

이 내 노력이 무엇

// 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 properties\n---------------------"); 
     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); 
      } 
     } 
     }) 

    }); 

    } 
); 

그것의 튜토리얼 this에서 : 내가 사용 bluebirdjs 여기

내가 코 루틴에 다시 노력했습니다 프로세스의 산출 된 (Pun은 부분적으로 의도 된 것입니까?)

"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 생성자는 약속을 반환하지 않으므로 yield이 필요하지 않습니다. 모든 방법을 약속하기 위해 promisifyAll을 실행하고 싶습니다.

그래서 :

let service = Promise.promisifyAll(new splunkjs.Service({...})); 

다음, 당신은 searchAsync를 호출됩니다 search의 promisified 버전을 호출합니다. 그것이 약속을 되 돌리면, 당신은 그것을 양보 할 것이고 콜백을 건네주지는 않을 것입니다.

let job = yield service.searchAsync(...); 

마지막으로, 당신은 반환 할 것을 반환 :

return job; 
관련 문제