javascript - 无法 promise 晦涩的库,然后在协程中使用它

标签 javascript promise bluebird

所以我正在尝试对 splunk-sdk 库进行 promisify,但我似乎不明白 promisify 是如何工作的,至少对于协程是这样。

注意:我正在使用 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 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教程

这就是我的努力所取得的成果(双关语部分意图?)

    "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)
      }

    });

作业对象在我尝试将进程转换为协程时没有任何功能,这可能是错误的。

有人可以提供一些一般指导吗?

最佳答案

splunkjs.Service 构造函数不会返回 promise ,因此您不必yield 它。您确实希望在其上运行 promisifyAll,以 promise 其所有方法。

所以:

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

接下来,您想要调用 search 的 promise 版本,它将被称为 searchAsync。由于这将返回一个 promise ,您将放弃它(并且您不传递回调);

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

最后,您只需返回您想要返回的内容即可:

return job;

关于javascript - 无法 promise 晦涩的库,然后在协程中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38748198/

相关文章:

javascript - 具有层次结构的网格自定义命令调用 javascript 函数两次。

javascript - 抛出错误时,React-native fetch 无法设置状态

javascript - 意外的 performace.navigation.type onbeforeunload

javascript - 使用 Protractor 获取同一元素的不同值的数组

javascript - promise.all 只返回第一个数据

Javascript:给定函数列表,如何创建具有这些函数作为属性的对象?

javascript - 使用 Promises 从 node-sqlite 获取数据

javascript - 使用具有未定义的成功回调函数的 Bluebird

node.js - Node js : Bluebird Promisify in Mongoose middleware

javascript - 如何在 NodeJS (Bluebird) 中通过 Promise 链保存数据