簡體   English   中英

當我嘗試要求特定功能時,無法導出全局匿名對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM