2

ChildAdded обратного вызова внутри метода, называется, ну, каждый раз, когда ребенок добавил (AKA несколько раз):Подключение повторяющегося обратного вызова к обещанию цепи

 listenToBuildRequests({ 
      childAdded: (value, key) => { 
       console.log('value, key -> ', value, key); 
      } 
     }); 

Есть прочь, с ES6 или 3 чтобы связать его с цепочкой обещаний?

childAdded() 
    .then(... 

Я знаю, что это не стандарт, и я знаю, что обещает запустить один раз через и это потребует генерации нового обещания каждый раз. Однако работа с Firebase и обещает это сэкономит мне необходимость повторно начинать обещание цепи внутри обратного вызова:

listenToBuildRequests({ 
      childAdded: (value, key) => { 
       createBuildDirectory(appId). 
         then(... 
      } 
     }); 

Очень простой пример JSBin (без сцепления), не предполагая, повторить рисунок обещание, а играть с концепцией: http://jsbin.com/mekoza/edit?js,console

+0

'createBuildDirectory' должен вернуть обещание, которое выполняет (или отклоняет) после завершения асинхронной операции. «Тогда (...» вы закодировали (один раз) все еще работает, потому что его вызвали по возвращенному обещанию. – traktor53

+0

Нет, установка цепочки обещаний внутри слушателя - это именно то, что нужно сделать. Что было бы обещанием вне 'listToBuildRequests 'представляют? – Bergi

ответ

1

Обещание может быть разрешено только один раз. Поскольку on() может срабатывать несколько раз, его нельзя привязать в цепочку обещаний.

Если вам нужен только первый добавленный ребенок, вы можете использовать once(). Это срабатывает только один раз и делает возвращает обещание.

+0

У меня есть чувство, что это может быть технически сделано. Обещание в какой-то мере является владельцем обратных вызовов. Есть ли причина, почему эти обратные вызовы не могут быть запомнены и повторно использованы с различными переменными? – Guy

+0

Например, упрощенная POC: http://jsbin.com/mekoza/edit?js,console – Guy

+2

Технически очень удобно вызывать метод каждый раз, когда добавляется ребенок, но это не было бы обещанием. –

0

ChildAdded callback внутри метода вызывается, ну, каждый раз, когда добавлен ребенок (он несколько раз). Есть ли прочь, с ES6 или сторонником, чтобы подключить его к цепочке обещаний?

Вы можете сделать это:

(function() { 

    // do some stuff 

    return Promise.resolve("pass this value on to .then") 
})() 

.then() 
.then() 
.then(); 

, но, как указано в пункте 25.4 из ECMAScript 2016:

Обещание называется быть решен, если оно не принято, то есть если он выполнено или отклонено.

Обещание разрешается, если оно разрешено, или если оно было «заблокировано» , чтобы соответствовать состоянию другого обещания. Попытка разрешить или отклонить разрешенное обещание не имеет никакого эффекта.

и поэтому вы не можете отклонить или разрешить Promise после его разрешения. Таким образом, нет никакого способа создать новые Promise для каждого прогона сети Promise.

+0

У вашего фрагмента есть синтаксическая ошибка – Bergi

+0

Спасибо, что указали недостающую точку с запятой в конце. – rabbitco

+0

Это была не ошибка. – Bergi

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