【发布时间】:2016-05-20 09:56:31
【问题描述】:
我只是在学习 node.js 生成器,我想让生成器从生成器调用的异步方法的回调中产生一个值。以下代码是我当前的示例。第一个生成器 (get_urls) 返回网站某些页面的一系列 URL。它工作正常。
第二个生成器应该使用 unirest 来检索这些网页中的每一个,以便生成器可以返回页面内容。但是,我不知道如何从 unirest.end() 函数的回调中屈服。
可能有一些库可以更全面地执行此操作(并且具有更好的错误处理能力),但我试图了解最低级别,以便当我足够聪明地使用它们时,我可以从库中获得更多。
#!/usr/local/bin/node
// -*- mode: Javascript; -*-
var unirest = require( 'unirest' );
for (var url of get_urls( 'http://www.example.com/generated-page?n=1' ))
console.log( 'Get url', url );
for (var page of get_pages( 'http://www.example.com/generated-page?n=1' ))
console.log( 'Got page', page );
function* get_urls( url ) {
do {
yield url;
var rx = url.match( /^(.*?n=)([0-9]+)$/ );
if (rx) {
if (rx[2] >= 3) break;
url = rx[1] + (parseInt(rx[2]) + 1).toString( );
}
} while (rx);
}
function* get_pages( url ) {
do {
// *** This is what I want to do, but it's not the right way to do it! ***
// unirest.get( url ).end( function (rsp) { yield rsp; } );
var rx = url.match( /^(.*?n=)([0-9]+)$/ );
if (rx) {
if (rx[2] >= 3) break;
url = rx[1] + (parseInt(rx[2]) + 1).toString( );
}
} while (rx);
}
【问题讨论】:
-
这是不可能的。您只能从生成器函数本身产生收益,而不能从某些回调(尤其是异步回调)中产生。
标签: javascript node.js asynchronous generator yield