[英]Exporting a global anonymous object doesn't work when I try to require a specific function
假設我有一個具有以下結構的項目:
lib/
api.js
thing.js
index.js
每個模塊的代碼如下(在不丟失事物含義的情況下進行了簡化)。
/* lib/api.js */
"use strict";
var Api = function() {
};
Api.prototype.authenticate = function(credentials) {
var self = this;
return new Promise((resolve, reject) => {
self.token = {
id: 1,
token: "somesortoftoken"
};
resolve();
});
};
Api.prototype.request = function(data) {
var self = this;
return new Promise((resolve, reject) => {
console.log(self.token);
if (self.token) {
resolve("success");
}else{
reject("failure");
}
});
};
module.exports = new Api();
使用new
關鍵字導出的目的是確保始終返回同一對象,因為我想進行一次身份驗證並保留已身份驗證的api對象。
下一個模塊調用API進行請求。 請注意,我需要api,然后在其上調用函數request
。
/* lib/thing.js */
"use strict";
var api = require('./api.js');
var thing = {
storeThing: function(thingData) {
return new Promise((resolve, reject) => {
api.request(thingData).then(result => {
resolve(result);
}).catch(error => {
console.log(error);
});
});
}
};
module.exports = thing;
最后,我有一個通過API進行身份驗證的入口點,然后調用thing
庫。
/* index.js */
"use strict";
var api = require('./lib/api.js');
var libThing = require('./lib/thing.js');
var credentials = {
username: "test@test.com",
password: "password"
};
api.authenticate(credentials).then(result => {
return libThing.storeThing({ id: 1 });
}).then(result => {
console.log(result);
}).catch(error => {
console.log(error);
});
這可行。 我可以在項目中的任何地方都需要api.js
,它將按預期運行。 但是,如果我嘗試在lib/thing.js
進行以下更改,則它將失敗:
/* lib/thing.js */
"use strict";
var request = require('./api.js').request;
var thing = {
storeThing: function(thingData) {
return new Promise((resolve, reject) => {
request(thingData).then(result => {
resolve(result);
}).catch(error => {
console.log(error);
});
});
}
};
module.exports = thing;
根據我的診斷,返回的request
函數具有undefined
,因此顯然無法訪問任何屬性。
我覺得這是我應該理解的東西,但實際上我不明白為什么會這樣。 如果require('./api.js')
返回相同的全局對象,那么為什么require('./api.js').request
不會返回從該對象派生的函數,這使我require('./api.js').request
。 評估時是否有其他原因或更明顯?
這是因為在引用對象屬性函數時正在更改this
上下文。
在這種情況下, this
將綁定到全局對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.