第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

讓構(gòu)造函數(shù)返回承諾是不好的做法嗎?

讓構(gòu)造函數(shù)返回承諾是不好的做法嗎?

紅顏莎娜 2019-06-06 13:55:20
讓構(gòu)造函數(shù)返回承諾是不好的做法嗎?我正在嘗試為一個博客平臺創(chuàng)建一個構(gòu)造函數(shù),它的內(nèi)部有許多異步操作。這些內(nèi)容包括從目錄中抓取帖子、解析它們、通過模板引擎發(fā)送它們等等。所以我的問題是,讓我的構(gòu)造函數(shù)返回一個承諾而不是他們調(diào)用的函數(shù)的對象是不明智的嗎?new反對。例如:var engine = new Engine({path: '/path/to/posts'}).then(function (eng) {    // allow user to interact with the newly created engine object inside 'then'    engine.showPostsOnOnePage();});現(xiàn)在,用戶也可能不提供補充承諾鏈:var engine = new Engine({path: '/path/to/posts'});// ERROR// engine will not be available as an Engine object here這可能會造成問題,因為用戶可能會混淆為什么 engine 施工后不可用。在構(gòu)造函數(shù)中使用允諾的理由是合理的。我希望整個博客在建設(shè)階段之后都能正常運行。但是,在調(diào)用之后,似乎幾乎無法立即訪問該對象。new.我一直在爭論用一些類似于engine.start().then()或engine.init()而不是回報承諾。但這些看起來也很難聞。編輯:這是在一個Node.js項目中。
查看完整描述

3 回答

?
慕尼黑的夜晚無繁華

TA貢獻(xiàn)1864條經(jīng)驗 獲得超6個贊

我遇到了同樣的問題,并想出了這個簡單的解決方案。

與其從構(gòu)造函數(shù)中返回承諾,不如將其放入this.initialization財產(chǎn),如下所示:

function Engine(path) {
  var engine = this
  engine.initialization = Promise.resolve()
    .then(function () {
      return doSomethingAsync(path)
    })
    .then(function (result) {
      engine.resultOfAsyncOp = result    })}

然后,在初始化后運行的回調(diào)中包裝每個方法,如下所示:

Engine.prototype.showPostsOnPage = function () {
  return this.initialization.then(function () {
    // actual body of the method
  })}

從API使用者的角度來看:

engine = new Engine({path: '/path/to/posts'})engine.showPostsOnPage()

這是因為您可以向一個承諾注冊多個回調(diào),它們要么在它解決后運行,要么在附加回調(diào)時運行(如果已經(jīng)解決了)。

這就是為什么蒙戈斯金起作用了,只是它實際上不使用承諾。


編輯:自從我寫了這個回復(fù)后,我就愛上了ES6/7語法,所以還有另一個例子。你今天可以和Babel一起用。

class Engine {

  constructor(path) {
    this._initialized = this._initialize()
  }

  async _initialize() {
    // actual async constructor logic
  }

  async showPostsOnPage() {
    await this._initialized    // actual body of the method
  }}

編輯*您可以在節(jié)點7和--harmony旗子!


查看完整回答
反對 回復(fù) 2019-06-06
?
守著一只汪

TA貢獻(xiàn)1872條經(jīng)驗 獲得超4個贊

為了避免關(guān)注點的分離,使用工廠來創(chuàng)建對象。

class Engine {
    constructor(data) {
        this.data = data;
    }

    static makeEngine(pathToData) {
        return new Promise((resolve, reject) => {
            getData(pathToData).then(data => {
              resolve(new Engine(data))
            }).catch(reject);
        });
    }}


查看完整回答
反對 回復(fù) 2019-06-06
  • 3 回答
  • 0 關(guān)注
  • 515 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號