2016-03-13 83 views
1

所以我很難搞清楚如何創建一個適用於不同的firebase查詢/不同的承諾的函數。創建一個承諾回調

考慮這個承諾,它會將空輸出數組轉換爲查詢/承諾的返回數據。

//userKeys is an array with my 'queries' 
Promise.all(userKeys.map(function(key) { 
     return database.child(key).once("value") //Returns a promise 
    })).then(function(respond) { 
     userData = respond; 
    }); 

這很好用。所以我想我會創建一個函數來處理不同的查詢,那就是我剛到達死衚衕的地方。

所以我只會換我以前的代碼在功能

function query(keys, array) { 
    return Promise.all(keys.map(function(key) { 
     return ref.child(key).once("value") 
    })).then(function(respond) { 
     array = respond; //This won't work 
     return respond; 
    }); 
} 

所以,我想回到應許,然後我就可以做到這一點上

someQuery = query(queryKeys); 
someQuery.then(function(data){ //Manual written array to store data here 
queryResults = data}) 

我仍然需要存儲數據一個程序化的數組,我無法弄清楚。

所以回頭看看我上面的第二段代碼(我的函數)第二個參數是我想要傳遞的一個數組,我的選擇數組將填充數據,不管工作。如果我更簡化我的功能,我會開始看到奇怪的事情。

output = []; 
function modify(arrayName) { 
    var data = ["1", "2", "3", "4"]; 
    arrayName = data; //Doesnt work 
    arrayName = data.slice() //Doesnt work 
    arrayName.push(data) //Works, but I don't want to push I want to copy 
} 
modify(output); //Output will stay empty 

爲什麼我的輸出數組保持爲空?這是正常的嗎?另外,當我控制檯登錄arrayName時,它會返回一個對象,當它清楚地顯示一個數組時。有人可以詳細說明嗎?

我有一種感覺,我最終必須爲將來每次查詢時手動編寫一份承諾,我只是想知道這是否是一種更有效的方式。

回答

1

在JavaScript中,任何非原始值都由「參考副本」(more details in this answer)傳遞。

,您可以更新使用Array#splice()

function mutate(arr) { arr.splice(0, arr.length, 1, 2, 3); } 
var a = []; 
mutate(a); 
console.log(a); // [1,2,3] 

給定的陣列,例如:內容的splice功能是有點不方便的情況下,預計每個新項目作爲一個單獨的參數傳遞。這可以通過使用Function#apply()被合作周圍(或在現代化的JS的spread operator):

function mutate(dest, src) { dest.splice.apply(dest, [0, dest.length].concat(src)); } 
var arr = [1,2,3]; 
mutate(arr, [6]); 
console.log(arr); // [ 6 ] 

更簡單的方法是將傳遞一個對象,包含數組到您的mutator功能:

var myData = { array: [] }; 
function mutate(obj, newArray) { 
    obj.array = newArray; 
} 
mutate(myData, [1,2,3]); 

那就是說,你確定你不需要承諾提供的回調嗎?如果您使用您描述的幫助功能,您將不會收到有關何時/如果收到數據的任何反饋。換句話說,有什麼問題「所以我試着回覆承諾,然後我可以在」「步驟上做到這一點?

+0

但是,請不要。這實際上不是承諾如何使用。 –

+0

@MadaraUchiha你指的是答案的第一部分,拼接和應用? – Nickolay

+0

@MadaraUchiha最後一次數據加載後,它將使用angularJS在視圖中呈現。那麼Nickolay做錯了什麼?而Nickolay,那是錯誤的,我必須爲每個承諾單獨做。我想不出有什麼辦法可以做到這一點,我知道我不會收到任何反饋,但我不認爲我需要它,因爲無論如何,只要它加載,我就會將它呈現在我的視圖中。 – Abdel