V8中的Javascript等价物?

时间:2014-01-24 00:29:00

标签: javascript c++ node.js v8

我正在玩NodeJS和V8,试图同时学习它们。

我想用C ++翻译这个简单的JS系列。

global.Game = { sleep: call_some_CPP_function }; 

在过去的两天里,我一直在拼凑互联网上的代码和其他人的源代码,试图了解它是如何工作的,除了我没有太多结果。

下面的代码不起作用,如果我执行console.log(global.Game),我什么也得不到。

#include "node.h"
#include "v8.h"

namespace node{

    using namespace v8; // make life easier

    // define a sleepy thread blocker
    Handle<Value> call_some_CPP_function(const FunctionCallbackInfo<Value>& a){
        HandleScope scope(node_isolate);
        Sleep(3);
        return scope.Close(Undefined());
    }

    // let's create the object here
    // I'm calling this function elsewhere 
    void execme(){

        // I've read somewhere that I have to do this
        Locker locker(node_isolate);
        HandleScope scope(node_isolate);

        // I think these two set the execution context (variables) and "this" accordingly 
        // but I'm not sure
        Local<Context> context = node_isolate->GetCurrentContext();
        Context::Scope context_scope(context);

        // I need a reference to the global object, to assign my "Game" object
        Local<Object> global = node_env->context()->Global();

        // The only way is to invent a constructor for it
        Local<FunctionTemplate> function_template = FunctionTemplate::New();
        function_template->SetClassName(String::New("GameClass"));

        // and create a new instance using that constructor
        Local<Object> game_object = function_template->GetFunction()->NewInstance();

        // after that, add the "sleep" function, which executes the function above
        NODE_SET_METHOD(game_object, "sleep", call_some_CPP_function); 

        // and finally do the global.Game assignment
        global->Set(String::New("Game"), game_object);
    }

}

2 个答案:

答案 0 :(得分:2)

<强> game.cc

#include <node.h>
#include <v8.h>

using namespace v8;

// sleep 3 seconds
Handle<Value> Sleep(const Arguments& args) {
  HandleScope scope;
  Sleep(3000);
  return scope.Close(Undefined());
}

void init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("sleep"),
      FunctionTemplate::New(Sleep)->GetFunction());
}

NODE_MODULE(game, init)

<强> app.js

global.Game = require('./build/Release/game');

console.log(global.Game); // this will print "{ sleep: [Function] }"

//now you can call native sleep
Game.sleep();

文件:http://nodejs.org/api/addons.html#addons_hello_world

答案 1 :(得分:0)

我认为睡眠是一个很好的功能,因为它适用于其他基于 JS 的平台。

function sleep(milliseconds) {
  const date = Date.now();
  let currentDate = null;
  do {
    currentDate = Date.now();
  } while (currentDate - date < milliseconds);
}