2016-07-23 34 views
0

我在JavaScript中給出了以下任務:使用名爲getData的方法創建一個DataBase對象,該方法返回一個承諾。當這個承諾解決時,它返回一個數組。在javascript範圍之外使用數據

創建第二個稱爲Data的對象,該對象調用getData方法。爲Data創建一個名爲getFirst的方法,該方法返回數組中第一個成員的值。

如果我理解任務,這是不可能的,因爲您不能從回調之外的承諾分配值。

(實際上,任務更加複雜,但我簡化爲只顯示我是有問題的部分。)

這是我有:

function DataBase(){ 
    this.getData = function(){ 
     var data = [1, 2, 3, 4, 5]; 
     return Promise.resolve(data); 
    } 
} 

function Data(d){ 
    this.first = null; 
    that = this; 
    this.getFirst = function(){ 
     return this.first; 
    } 
    this.initialize = function(){ 
     dataBase = new DataBase(); 
     dataBase.getData().then(function(theArray){ 
      console.log(theArray); //works fine 
      that.first = theArray[0]; //doesn't work because promise is asyncronous 
     }) 
    } 
} 

d = new Data(); 
d.initialize(); 
result = d.getFirst(); 
console.log(result)// is null 
+0

'Data'不是方法,這是一個構造函數在這裏。 –

+0

你應該要求澄清。正如所給出的那樣,這個任務完全是無稽之談(是的,你可以在此引用我)。或者切換你的課程:-) – Bergi

+0

道歉。實際任務陳述「對象」,而不是方法。我在原帖中解決了我的錯誤。 – user3520634

回答

1

使用中承諾的initialize函數,從initialze功能太內返回一個承諾:

this.initialize = function(){ 
    dataBase = new DataBase(); 
    return dataBase.getData().then(function(theArray){ 
     console.log(theArray); //works fine 
     that.first = theArray[0]; //doesn't work because promise is asyncronous 
    }) 
}  

d.initialize().then(function() { 
    result = d.getFirst(); 
    console.log(result); 
}); 
+0

謝謝塔倫。你是對的。實際上,這些指令有着同樣的確切代碼,但是我很想在初始化時忽略這個明顯的解決方案。 – user3520634

+0

不客氣。你能接受這種情況下的答案嗎? –

0

你的理解是正確的。

用一個名爲getData的方法創建一個DataBase對象,該方法返回一個promise。當這個承諾解決時,它返回一個數組。

創建第二個稱爲Data的方法,該方法調用getData方法。爲Data創建一個名爲getFirst的方法,該方法返回數組中第一個成員的值。

這是非常非常草率的語言。承諾不要返回東西,他們滿足具有一定的價值。而getFirst肯定是不應該返回第一個成員本身,但返回承諾它

而且目前還不清楚Data是否應該是一個構造 /班,因爲如果因此它不應該被稱爲方法。或者如果不是,那麼「數據的方法」就沒有意義。

我會理解的任務,以便預期的結果簡直是

var DataBase = { 
    getData: function() { 
     var array = […]; 
     return Promise.resolve(array); 
    }, 
    getFirst: function() { 
     return this.getData().then(function(array) { return array[0]; }); 
    } 
};