2015-07-16 2 views
0

Я пытаюсь понять, как работают генераторы (как правило, и в koa). У меня есть файлы:(Koa.js) Основы генерации и урожайности

Rooms.js - это ручки размещения пользователя в комнату (Socket.io) и прочее, когда игрок назначен в комнату, я хочу, чтобы запустить Game.js модуль

var Game = require('./Game'); 
(...) 
Game.startGame(roomId) 

игры .js - function startGame*() вызывается из Rooms.js: и он должен сделать некоторый код, тогда я хочу, чтобы он подождал, скажем, 500 мс, а после этого он должен запустить еще один код. Функция

exports.startGame = function *(roomid) { 
    console.log("before sleep") 
    yield Utility.sleep(500) 
    console.log("after sleep") 
} 

и сон() в Utility.js:

exports.sleep = function(ms){ 
    return function(cb) { 
    setTimeout(cb, ms); 
    }; 
} 

Но это не работает - функцию генератора в Game.js. И я не знаю, что там не так. Пожалуйста помоги.

ответ

2

Генераторы должны быть защищены внешним кодом, «бегуном», например, библиотекой co.

Koajs использует библиотеку co под обложками, поэтому любое промежуточное программное обеспечение управляется co.

Непонятно мне, если вы используете Game.startGame (roomId) внутри бегуна (промежуточное ПО koajs), а так как это генератор, вы должны уступить его (который отсутствует в вашем коде).

У меня есть скринкаст на генераторы, которые вы можете найти полезным

http://knowthen.com/episode-2-understanding-javascript-generators/

Вот пример кода (сжатый в один файл), который является исполняемым:

// example.js 
'use strict'; 
let co = require('co'); 

let startGame = function *(roomid) { 
    console.log("before sleep") 
    yield sleep(500) 
    console.log("after sleep") 
} 

let sleep = function (ms){ 
    return function(cb){ 
    setTimeout(cb, ms); 
    } 
} 

co(function *(){ 
    // your code was missing yield 
    yield startGame(123); 
}).catch(function(err){ 
    console.log(err); 
}); 

здесь выход:

$node example.js 
before sleep 
after sleep 
+0

Спасибо! Вы правы, я не понял, прежде чем этот генератор должен выходить извне. Кроме того, ваш скринкаст был очень информативным, и я надеюсь, что мне еще лучше понять генераторы. :) – jwitos

Смежные вопросы