2016-03-13 2 views
1

Так что мне очень сложно выяснить, как создать функцию, которая будет работать для различных запросов или различных запросов на битву.Создание обратного вызова для обещания

Рассмотрите это обещание, которое превратит пустой массив вывода в возвращаемые данные запроса/обещания.

//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() (или spread operator в современном JS):

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 ] 

Легче всего было бы передать объект, содержащий массив вашей функции мутаторный:

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

Тем не менее, вы уверены, что вам не нужен обратный вызов, который обещал предоставить? Если вы используете вспомогательную функцию, как вы описываете, вы не получите никакой информации о том, когда/если данные получены. Другими словами, что было не так с «Итак, я попытался вернуть обещание, которое я смогу сделать после этого» шаг?

+0

Но, пожалуйста, не надо. Это не значит, что обещания должны использоваться. –

+0

@MadaraUchiha Вы имеете в виду первую часть ответа, с сращиванием и применить? – Nickolay

+0

@MadaraUchiha В конце концов, как только данные будут загружены, они будут отображаться в виде с помощью углового джойстика. Так что же Николай делает не так?А Nickolay, что-то не так с этим, я должен был бы сделать это за каждое обещание отдельно. Я не могу придумать способ сделать это программно, я знаю, что я не получу никакой обратной связи, но я не думаю, что мне это нужно, потому что я буду показывать ее в своем представлении, как только она будет загружена. – Abdel

Смежные вопросы