V8中的JavaScript当量

Javascript equivalents in V8?

本文关键字:当量 JavaScript 中的 V8      更新时间:2023-10-16

我正在使用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);
    }
}

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

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

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