firebase: получить ключ ThenableReference - PullRequest
0 голосов
/ 25 сентября 2018

Я работаю с Firebase и Javascript.Мне нужно получить ключ к ссылке, которая была создана push().

Мой код ждет обещания, возвращенного push, и затем читает ключ.Это выглядит так:

firebase.database().ref("preds/").push()
.then(function(newReference){
    console.log(newReference.key);
});

Теперь я смотрю на фрагмент кода, написанный коллегой.Он не использует обещания.Вместо этого он напрямую использует ключ:

var newReference = firebase.database().ref("preds/").push()
console.log(newReference.key)

Это выглядит намного лучше (особенно потому, что реальный код длиннее, чем в этих примерах).Но я подозреваю, что это может быть состояние гонки.Что если мы все еще ждем ответа от базы данных и ключ уже используется?Но я не смог создать проблем с его кодом.

Я посмотрел на Firebase docs , и они немного сбивают с толку.В нем говорится, что push() возвращает:

Объединенное обещание и справка;разрешается, когда запись завершена, но может быть немедленно использована в качестве ссылки на дочернее местоположение.

Их пример выглядит следующим образом:

var messageListRef = firebase.database().ref('message_list');
var newMessageRef = messageListRef.push();
newMessageRef.set({
  'user_id': 'ada',
  'text': 'The Analytical Engine weaves algebraical patterns just as the Jacquard loom weaves flowers and leaves.'
});

Thisвыглядит как использование newReference.key, но ничего из этого не блокирует.Если я правильно понимаю, эти функции просто связаны для асинхронного выполнения.Тем не менее, они говорят, что ссылка может быть использована немедленно для доступа к child location.

Я искал SO и нашел этот вопрос: В Firebase при использовании push () Как мне получить уникальный идентификатор Dan_Mindru говорит:

Любой, кто найдет этот вопрос и использует Firebase 3+, получит уникальные идентификаторы автоматически сгенерированных объектов после push, используя свойство ключа (не метод) в обещанииснимок

И его код выглядит точно так же, как и моя первоначальная версия:

firebase
  .ref('item')
  .push({...})
  .then((snap) => {
     const key = snap.key 
  })

Я знаю, что это очень распространенный вопрос о firebase, но я надеюсь, что предоставил достаточно контекста, чтобы оправдатьмое замешательство.Как правильно получить ключ для вновь созданной ссылки?Нужно ли ждать обещание или я могу получить прямой доступ к ключу?

1 Ответ

0 голосов
/ 25 сентября 2018

Ключ, который генерируется при вызове push(), является чисто клиентской операцией.При вызове push() без аргументов вызов сервера не происходит.Таким образом, первые два фрагмента кода, которым вы поделились, эквивалентны.

В вашем последнем фрагменте кода push({...}) вызывает вызов сервера, чтобы записать объект в базу данных.Но и здесь ключ для нового дочернего узла генерируется в коде на стороне клиента.

Подробнее об этих push-идентификаторах см. В блоге: 2 ^ 120 способов обеспечения уникальности идентификаторов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...