无法弄清楚如何使用asynchronous请求的收益率

我对节点有点新鲜,对于koa我是全新的。 我正在尝试使用生成器来向API执行asynchronousWeb请求,但是我无法弄清楚如何将所有的部分放在一起。

作为一个说明,我使用蓝鸟,因为我看到一些例子这样做,这似乎是一个好主意。 如果没有蓝鸟有更简单的方法去做我想做的事情,那也是很好的做法。

在我的模块中:

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

我这样称呼它:

 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; }; 

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

 search returned: [object Generator] making request search returned2: {"value":{"isFulfilled":false,"isRejected":false},"done":false} search returned3: {"done":true} 

我知道我的代码是那种地方,但我已经工作了几个小时,而且我还没有接近修复它。

谢谢!

请不要在运行时代码中调用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; }); 

协程返回一个你可以用另一个协程来使用的承诺,或者把它用作承诺。 既然你已经在使用生成器,那么你可以使用另一个协程:

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

从那里调用一个发生器不会接近工作。 调用一个生成器只是返回它的迭代器,并没有做任何事情。 你想要的是什么(未经testing):

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

你不需要这样做。 这是Koa的工作。 它会得到您所承诺的承诺,等待解决,将parsing后的值作为parameter passing给iterator.next() ,它将成为您的variablesresult ,并且函数将继续下一个yield (或函数的结尾)。

但是,就你而言,目前还不清楚你是否想要在最后一行中做出回应。 首先,你必须承诺承诺,所以这可能会导致Koa运行时错误。 我怀疑你想要的东西就像

 this.body = response; 

您可能会考虑使用现有的请求包装器,例如共同请求构build与koa构build的合作库一起工作。

在koa你会做这样的事情:

 // server.js var request = require('co-request'); app.use(function *(){ try{ var result = yield request('http://apisitegoeshere.com/apicall'); this.body = result.body; } catch(err){ this.throw(500); } });