2013-06-12 94 views
1

我正在爲使用C++的node.js編寫附加組件。從node.js本地代碼調用回調

這裏的一些片段:

class Client : public node::ObjectWrap, public someObjectObserver { 
public: 
    void onAsyncMethodEnds() { 
    Local<Value> argv[] = { Local<Value>::New(String::New("TheString")) }; 
    this->callback->Call(Context::GetCurrent()->Global(), 1, argv); 
    } 
.... 
private: 
    static v8::Handle<v8::Value> BeInitiator(const v8::Arguments& args) { 
    HandleScope scope; 
    Client* client = ObjectWrap::Unwrap<Client>(args.This()); 

    client->someObject->asyncMethod(client, NULL); 

    return scope.Close(Boolean::New(true));   
    }  

    static v8::Handle<v8::Value> SetCallback(const v8::Arguments& args) { 
    HandleScope scope; 
    Client* client = ObjectWrap::Unwrap<Client>(args.This()); 
    client->callback = Persistent<Function>::New(Handle<Function>::Cast(args[0])); 

    return scope.Close(Boolean::New(true)); 
    } 

我需要保存一個javascript函數回調後調用它。 Client類是另一個對象的觀察者,應該從onAsyncMethodEnds調用javascript回調。 不幸的是,當我調用函數「BeInitiator」我收到「總線錯誤:10」的錯誤只是回調調用()之前

感謝諮詢

+0

你在同一個線程中調用它嗎? – loganfsmyth

+0

否..「asyncmethod」啓動一個新線程。這個方法是我鏈接的lib的一部分,它使用talk_base /線程來運行異步操作。 – helloIAmPau

回答

3

你不能->Call從另一個線程。 JavaScript和Node是單線程的,試圖從另一個線程調用一個函數就等於試圖一次運行兩個JS線程。

你應該重新工作你的代碼,不要這樣做,或者你應該閱讀libuv的線程庫。它提供了uv_async_send,它可以用來從單獨的線程觸發主JS循環中的回調。

這裏有文檔:http://nikhilm.github.io/uvbook/threads.html

+0

我想這可以解決問題。不幸的是我不能使用libuv ..我會嘗試使用talk_base/thread的Send方法來做同樣的事情。非常感謝! – helloIAmPau

+0

爲什麼你不能使用'libuv'? – loganfsmyth

+0

我只問,因爲如果您正在編譯節點,您應該自動訪問它。 – loganfsmyth