我使用Node.js創建了一個API,我不想讓API更改,也不想向函數添加額外的參數。但是,庫中的內部代碼現在需要在內部API方法和外部方法之間發送一些元數據。在函數之間傳遞元數據
有沒有辦法通過某種方式JS不涉及參數/參數的函數之間(元)數據?
TL; DR,它會傳遞函數之間的元數據API的JS的目的,是不應該改變的簽名真的很有用。 (一個技巧是如果每次調用函數時都創建函數,則可以將數據分配到函數對象本身,但在這種情況下不是這樣(函數在每次調用時都不會創建)。)
我目前使用的技巧 - 這是不是一個很好的 - 有API中使用{}對象的選項。我在該對象對象「__preParsed」中傳遞隱藏屬性。用戶將像通常那樣使用該對象對象,在幕後我使用它來記錄一些他們不需要知道的事情。
確定這裏是代碼:
//公共API
beforeEach.cb = function (desc, opts, fn) {
const _args = pragmatik.parse(arguments, rules.hookSignature);
_args[ 1 ].cb = true;
return beforeEach.apply(ctx, _args);
};
beforeEach = function (desc, opts, aBeforeEach) {
handleSetupComplete(zuite);
const _args = pragmatik.parse(arguments, rules.hookSignature);
const obj = { //have to do this until destructuring works
desc: _args[ 0 ],
opts: _args[ 1 ],
fn: _args[ 2 ]
};
handleBadOptionsForEachHook(obj.opts, zuite);
return 'there is more code but I omitted it';
};
,你可以看到第一個方法調用第二,或者第二可以直接調用,都是公共的API。
我們需要分析的參數在這兩個電話,但作爲一個優化,我們不應該對其進行解析第二次,如果第二個方法是由第一,而不是直接調用。
我會用暫時的解決方法是:
beforeEach.cb = function (desc, opts, fn) {
const _args = pragmatik.parse(arguments, rules.hookSignature);
_args[ 1 ].cb = true;
_args[ 1 ].__preParsed = true;
return beforeEach.apply(ctx, _args);
};
的OPTS選擇對象是公開的,但用戶不會知道的__preParsed財產。內部API將會。
這樣做的問題是,用戶可以直接調用公共API而不使用選項對象,並且由於簽名非常多可變參數,因此直到我用解析引擎解析它之後,我才真正知道它arg如果有的話是對象對象!
真的很好,只要功能還沒有使用'this' –
耶不幸的是,已經有一個背景下,雖然我可以只添加隱藏屬性,這種情況下,問題是,我必須設置,然後取消設置屬性,因爲這是在該上下文中的方法,並且屬性值只與方法調用的生命週期有關......最好將它作爲參數傳遞。 –
我打算帶出代碼,以便清楚發生了什麼 –