我試圖了解 Node 在內部是如何作業的。我真的對檢查階段很感興趣,但無法理解該階段佇列是如何處理的。現在我無法理解 set_immediate_callback_function 在哪里定義。這種方法是 Environment 類的一部分,但我看不到它。
此方法在設定階段在以下位置呼叫:
void SetupTimers(const FunctionCallbackInfo<Value>& args) {
CHECK(args[0]->IsFunction());
CHECK(args[1]->IsFunction());
auto env = Environment::GetCurrent(args);
env->set_immediate_callback_function(args[0].As<Function>());
env->set_timers_callback_function(args[1].As<Function>());
}
uj5u.com熱心網友回復:
的set_immediate_callback_function是由前處理器生成,通過被稱為技術的X宏。
讓我們分解一下。您指的是此代碼:
void SetupTimers(const FunctionCallbackInfo<Value>& args) {
CHECK(args[0]->IsFunction());
CHECK(args[1]->IsFunction());
auto env = Environment::GetCurrent(args);
env->set_immediate_callback_function(args[0].As<Function>());
env->set_timers_callback_function(args[1].As<Function>());
}
Grepping forset_immediate_callback_function并沒有透露任何資訊。但是如果你搜索immediate_callback_function(沒有set_),你會在這里找到這個:
#define ENVIRONMENT_STRONG_PERSISTENT_VALUES(V) \
...
V(immediate_callback_function, v8::Function) \
這種模式通常稱為X-Macros。按照跟蹤,您可以在ENVIRONMENT_STRONG_PERSISTENT_VALUES 此處找到:
#define V(PropertyName, TypeName) \
inline v8::Local<TypeName> PropertyName() const; \
inline void set_ ## PropertyName(v8::Local<TypeName> value);
ENVIRONMENT_STRONG_PERSISTENT_VALUES(V)
ENVIRONMENT_STRONG_PERSISTENT_TEMPLATES(V)
#undef V
注意這一行:
inline void set_ ## PropertyName(v8::Local<TypeName> value);
PropertyName 是immediate_callback_function和##是字串連接。所以,最后這就是set_immediate_callback_function.
對于確切的擴展,您需要運行前處理器。在這一點之后,我發現很難跟隨我腦海中的擴展。它最終應該是這樣的:
inline v8::Local<v8::Function> immediate_callback_function() const;
inline void set_immediate_callback_function(v8::Local<v8::Function> value);
看起來 NodeJs 代碼庫使用 C 前處理器來生成類似屬性的機制。在 C 和 C 中,不直接支持屬性,我假設他們想避免重復代碼。這就是他們通過前處理器使用代碼生成的原因。
(X-Macros 是一種不應過度使用的技術。然而,很難決定在哪里畫線。如您所見,這使得推理代碼變得更加困難。另一方面,手動代碼重復可能更多容易出錯且冗長。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315650.html
上一篇:如何在React中通過預先簽名的S3URL預覽影像?
下一篇:在nodejs中設定每次呼叫超時
