【问题标题】:(Koa.js) Generators and yield basics(Koa.js) 生成器和产量基础知识
【发布时间】:2015-07-16 17:28:40
【问题描述】:

我正在尝试了解生成器的工作原理(通常以及在 koa 中)。我有文件:

Rooms.js - 它处理将用户放置到房间 (socket.io) 和其他东西,当玩家被分配到我要运行的房间时 Game.js 模块

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

Game.js - 从 Rooms.js 调用函数 startGame*():它应该执行一些代码,然后我希望它等待 500 毫秒,然后它应该运行更多代码。

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

和 sleep() 函数:

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

但它不起作用 - Game.js 中的生成器函数。而且我不知道那里出了什么问题。请帮忙。

【问题讨论】:

    标签: javascript node.js koa


    【解决方案1】:

    生成器必须由外部代码执行,例如co 库之类的“运行器”。

    Koajs 在后台使用 co 库,因此任何中间件都由 co 运行。

    我不清楚您是否在运行器(koajs 中间件)中运行 Game.startGame(roomId),并且由于它是生成器,因此您必须生成它(您的代码丢失了)。

    我有一个关于生成器的截屏视频,您可能会觉得有帮助

    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
    

    【讨论】:

    • 谢谢!你是对的,在生成器必须从它外部产生之前我不明白。此外,您的截屏视频非常提供了丰富的信息,我希望能帮助我更好地理解生成器。 :)
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2018-05-25
    • 2014-11-28
    相关资源
    最近更新 更多