簡體   English   中英

在需要其他模塊之前等待異步操作

[英]wait for an async operation before requiring other modules

在我的main.js中,我正在異步讀取文件。 加載文件后,我在GLOBAL命名空間中設置了一些對象並在我的require d模塊中使用它們(使用GLOBAL命名空間或不使用它是一個不同的故事,無論如何我都在使用它)。

我的require d模塊立即期望該變量在加載時存在。 那么如何讓它等到main.js中我的文件讀取完成? 我只是在readFile的回調中需要模塊嗎? 或者有更好的方法嗎?

例:

fs.readFile('./file', function (data) {
    // do something

    GLOBAL.obj = data;
});

require('./module.js');

module.js

obj.someFunction();

你不喜歡這種解決方案的直覺是可以理解的。 (你的胃是對的)。 清理它的正確方法(你應該花時間 - 未來 - 你會感謝你的):

  • 通過你的十個模塊中的每一個
  • 每個人都要經歷它出口的所有功能
  • 對於每個函數計算出來,他們實際依賴的是什么全局變量。
  • 將這些作為參數添加到函數中。 如果他們現在采取了很多論點,可以考慮將它們分組到對象中,創建有用的模型。

如果一堆函數都依賴於同一組變量,您還可以考慮創建一個工廠函數

  • 創建一個函數,將以前的全局變量作為參數,並將所有模塊的代碼包裝到該函數中。

  • 使該功能成為模塊的單個導出。 它用作工廠函數,並為該模塊中的所有其他函數創建上下文。 它應該返回之前導出的模塊。

// DB used to be a global
module.exports = function(DB) {
    function getUser(user, cb) {
        DB.get('user', db);
    }
    return {getUser: getUser};
};

然后你可以像這樣使用它:

var module = require('module')(DB);
module.getUser(myUser, function(){}};

是的,只需遵循異步編程的規則#1。 依賴於回調發生的東西必須在該回調中執行。 由於您的require取決於異步中設置的變量,因此您只能在其中使用您的require

fs.readFile('./file', function (data) {
    // do something

    GLOBAL.obj = data;
    require('./module.js');
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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