Tag: 生成器

dynamic路线在科阿?

比方说,我有一个看起来像这样的路线数组: var routes = [ { route: '/', handler: function* () { this.body = yield render('home', template.home) } }, { route: '/about', handler: function* () { this.body = yield render('about', template.about) } } ]; 什么是最好的方式来app.use它们? 我尝试过这样做(用koa-route作为我的中间件): Promise.each(routes, function(r) { app.use(route.get(r.route, r.handler)); }).then(function() { app.use(function *NotFound(next) { this.status = 404; this.body = 'not found'; }); }); […]

Strava-V3和Javascript es6发生器=不兼容?

我使用node-strava-v3和Node 5.7从Strava的API中检索JSON集合。 其实很简单,实际上没有问题。 我只想借此机会尝试ES6发电机。 到目前为止,我认为我很了解这个概念。 但是在这个Node-Strava-V3 API封装的情况下,这些方法永远不会直接返回值或承诺。 只允许回叫。 这引出了我的问题:我怎样才能把ES6发电机的概念发挥出来? 拿这个:(这需要access_token你可以要求在Strava门户) var strava = require('strava-v3'); var mainActivity = {id: 504641206}; strava.activities.get(mainActivity, function (err, data){ if(err){ console.log("Strava GET issue: ", err); /// consume the JSON data here… }; //rest of the code 但我可以使用生成器暂停,直到这个“strava.activities.get()”方法结束? 这种方法不返回任何,没有价值,没有承诺。 感谢您的所有build议 缩略词

co node.js库的目的是什么?

我是node.js的新手,正在开发一个代码库,通过将调用包装到生成器函数中来利用co库。 一个简单的例子看起来像这样: module.exports.gatherData = function*() { // let img = //get the 1 pixel image from somewhere // this.type = "image/gif"; // this.body = img; co(saveData(this.query)); return; }; function *saveData(query) { if(query.sid && query.url) { // save the data } } 所以我去了github上的co主页,描述如下: “基于生成器的nod​​ejs和浏览器的控制stream程的优点,使用promise,让你以一种很好的方式编写非阻塞代码。” 在node.js的情况下,这个代码是不是也是非阻塞的? yield saveData(this.query)

节点返回从Q.async产生的值

有了这段代码: function * foo(ctx) { // process some things // yield some async stuff… return 'foo'; } Q.async(function * (ctx) { return yield foo(ctx); })(this).done(function(result) { console.log(result); }); 我期望的结果是foo() (即'foo' )的结果,但它是实际的发电机对象! 我在想什么,或者我在这里不明白? **解决scheme** 虽然答案是很好的解决办法,但我觉得我甚至可以通过简单的做法来缩短整个事情 result = Q.async(foo)(this);

Node.jsstream可以作为协程?

有没有办法使Node.jsstream作为协同程序。 例如斐波那契数字stream。 fibonacci.on('data', cb); //The callback (cb) is like function cb(data) { //something done with data here … } 期望 function* fibonacciGenerator() { fibonacci.on('data', cb); //Don't know what has to be done further… }; var fibGen = fibonacciGenerator(); fibGen.next().value(cb); fibGen.next().value(cb); fibGen.next().value(cb); . . . 从发生器获取所需的数字。 这里斐波那契数列仅仅是一个例子,实际上这个数据stream可以是任何文件,mongodb查询结果等等。 也许这样的事情 将“stream.on”函数作为生成器。 将产量放在callback函数中。 获取生成器对象。 接下来调用并获取stream中的下一个值。 如果是的话,至less是可能的,如果不是,为什么? 也许一个愚蠢的问题:)

准备一个function,重复使用发电机运行

我正在使用一个nodejs telnet实现,它使用一个事件来提供通知,每次从远程login客户端接收数据时,可以按如下方式进行订阅: client.on('data', [callback]); 我也使用了一个生成器runner(npm上的generator-runner)来执行工作stream。 我遇到的问题是,以这种方式产生值需要更多的承诺:传递一个委托来处理单个值。 我将如何去编写一个可以放置在生成器yield函数中的函数,并且每当我想要产生更多的input时可以重复这个函数? 我已经尝试过使用Baconjs,但是我不认为有阻止在stream上等待一个值的方法,至less我找不到这样的方法。 我愿意接受任何build议。 我唯一真正的要求就是能够将我的工作stream程放在一个平坦的代码块中,而不用链接承诺。 这里是我嘲笑的代码,这根本不起作用: var requirejs = require('requirejs'); requirejs(['telnet', 'baconjs', 'colourise', 'lodash', 'generator-runner'], function(Telnet, Bacon, Colourise, _, Async) { var configureClient = client => { client.do.transmit_binary(); }; Telnet.createServer(client => { var session = { connectedAt: Date.now(), user: { } }, write = _.compose(_.bind(client.write, client), Colourise.encode), readStream = Bacon.fromBinder(function […]

节点:按顺序产生进程,inheritancestdio

我想在节点中顺序启动一系列的cli进程。 我想开始第一个过程,等待它退出,然后开始第二个过程,依此类推。 这些进程是cli程序,所以它们必须inheritancestdio,以便用户可以与每个进行交互。 我在这里的代码产生了第一个进程,但是当它退出(我假设是因为它inheritance了stdio)父进程也退出。 我已经写了它与发电机,但我打开使用任何控制stream库来完成任务。 我试图使用npm包Q,但我无法弄清楚。 var cp = require('child_process'); var co = require('co'); var list = ['item', 'item2']; co(function* spawnTflix () { for (var i=0; i < list.length; i++) { var x = yield sp('program', ['-o', '–search='+list[i]]); } }); function sp (command, args) { return function (fn) { cp.spawn(command, args, { stdio: 'pipe' }); […]

发电机,承诺和合作或然后收益

我正在写一个nodejs程序,并需要在初始化时间获得一些configuration数据,所以我可以实例化一个单身人士。 configuration数据回来作为承诺,这意味着我必须dynamic初始化的东西,而不是在需要的时候,所以我可以module.exports = () => return new blah(config) 。 我不想要一个工厂返回一个可靠的 – 我想要它返回一个构造函数的新实例。 我有一个内部库,获取configuration数据并返回一个承诺。 我试图使用co或then-yield或类似的库,以便我可以把事情看作是同步的(我认为这是这些库的用途,但也许我的理解是有缺陷的),大多数情况下我可以做一个返回一个实例的工厂,并不返回一个可以用实例parsing的promise 简化代码: configuration读者: var read = function () { let c = projectConfig.load(); //returns a promise that resolves with config data return c; }); module.exports = {read}; 厂: let factory = ty.async(function * factory () { let cfg = yield configHelper.read(); console.log('config', […]

与koa路由器的多个中间件:“yield next”或“yield * next”?

有了koa-router ,在实现多个中间件的时候 ,为什么我不能yield* next ,而只是yield next , next是发生器呢? koa似乎在使用co , 经过一番捣乱之后 ,似乎是感谢了,但是谁能证实呢? yield* next使用yield* next有什么缺点,即使yield next就足够了? 我觉得它不太容易出错(至less对未来的开发者来说)。 可以帮助(虽然我没有完全得到发生的事情): https://github.com/alexmingoia/koa-router/blob/5.x/lib/router.js#L327 https://github.com/alexmingoia/koa-router/blob/5.x/lib/router.js#L336

我如何在JavaScript中使用asynchronous生成器?

我有一个API将返回一个游标获取更多的数据。 我嘲笑了这样的: function fetch(n) { return Promise.resolve({ results: [n], next: next < 10 && n + 1, }) } 我想要做的是弄清楚我可以如何使用async / await与发生器一起进行交互。 这基本上是我原型的东西: async function* api(url) { let result = await fetch(url) yield result while (result.next) { result = await fetch(result.next) yield result } } 这个想法是我应该能够创build一个asynchronous生成器,并从该生成器产生,以遍历游标: async function main() { const gen = api(0) const […]