无法弄清楚如何使用async请求使用yield

sno*_*lly 5 javascript generator node.js bluebird koa

我对节点有些新意,而且我对koa完全不熟悉.我正在尝试使用生成器来对API执行异步Web请求,但我无法弄清楚如何将所有部分放在一起.

作为一个注释,我使用蓝鸟,因为我看到一些例子这样做,这似乎是一个好主意.如果有一种更简单的方法来做我想要的没有蓝鸟,那也是完全没问题.

在我的模块中:

plugin.searchForItem = function * (name) {
  Promise = require('bluebird');
  request = Promise.promisifyAll(require('request'));
  console.log("making request");
  yield request.getAsync('http://apisitegoeshere.com/apicall').then(function * (result) {
    var response = result[0];
    var body = result[1];
    console.log(response.statusCode);
    yield response;
  });
};
Run Code Online (Sandbox Code Playgroud)

而我这样称呼它:

search.searchForShow = function (name) {
  data = this.plugins[0].searchForItem(name);
  console.log("search returned: " + data);
  console.log("search returned2: " + JSON.stringify(data.next()));
  console.log("search returned3: " + JSON.stringify(data.next()));
  return data;
};
Run Code Online (Sandbox Code Playgroud)

当我查看我的控制台时,我看到:

search returned: [object Generator]
making request
search returned2: {"value":{"isFulfilled":false,"isRejected":false},"done":false}
search returned3: {"done":true}
Run Code Online (Sandbox Code Playgroud)

我知道我的代码到处都是,但我已经工作了几个小时,我仍然没有更接近修复它.

谢谢!

Esa*_*ija 4

请不要promisifyAll在运行时代码中调用:这是不必要的,会扰乱应用程序逻辑,不属于那里,而且速度非常慢。

您需要将该方法标记为协程,否则它只是一个生成器。

var Promise = require("bluebird");
// Assumes request is promisified else where, like in your init file
var request = require("request");

plugin.searchForItem = Promise.coroutine(function* (name) {
    var response = yield request.getAsync("http://www.google.com").get(0);
    console.log(response.statusCode);
    return response;
});
Run Code Online (Sandbox Code Playgroud)

协程返回一个 Promise,您可以将其与另一个协程一起使用或仅将其用作 Promise。既然您已经在使用生成器,您不妨使用另一个协程:

search.searchForShow = Promise.coroutine(function* (name) {
  var data = yield this.plugins[0].searchForItem(name);
  console.log("search returned: " + data);
  return data;
});
Run Code Online (Sandbox Code Playgroud)