2017-02-23 134 views
0

我目前正在嘗試在構造函數中使用回調運行異步函數。然後我需要從回調中獲取數據,並在創建類的實例時使用它。我的代碼目前看起來是這樣的:在異步回調中調用超級

class Foo extends Bar { 
    constructor(data) { 
     someAsyncCall((response) => { 
      data.a = response; 
      super(data); 
     }); 
    } 
} 

任何幫助是極大的讚賞:)

+0

你的超級定義在哪裏? – Piyush

+0

@ P.K。 super是一個ES6關鍵字.. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super – mhodges

+1

當異步調用被啓動時,父類已經被構建,現在調用'super'已經太晚了。有一個原因是'super'必須是構造函數中的第一個調用(或者至少在使用'this'前調用)。 – 2017-02-23 17:52:45

回答

1

在我看來,我不會做它在構造函數中。使用Q庫和另一個輔助類作爲數據訪問層。

HelperClass.getFooById(id) 
    .then(function (data) { 
     return new Foo(data); 
    }) 

getFooById方法將使用Q.defer()並稱之爲Q.resolve(data)一旦數據被解決。

如果您在構造函數內部執行此操作,即使您已經有數據,也不會創建該類的實例而不發出請求。

Q庫:https://github.com/kriskowal/q

+0

我不知道我會說「絕對不要在構造函數裏面做」。它意味着可以這樣使用,MDN文檔給出了例子。 – mhodges

+0

公平點!我編輯過。 –

+0

你能發佈一個鏈接到這些例子嗎?我很好奇他們爲什麼會推薦這樣做。 –