Могу ли я смешать асинхронные / ожидающие обещания с наблюдаемым RXJS?

ОБНОВЛЕНИЕ. Поскольку этот ответ, похоже, получил некоторый интерес в последнее время, я хотел бы указать, что обсуждение g0 на трекер-проблеме Ruby устраняет обсуждаемую здесь функцию, а именно, запретить определение методов внутри тела метода .


Нет, Ruby не имеет вложенных методов.

Вы можете сделать что-то вроде этого:

class Test1
  def meth1
    def meth2
      puts "Yay"
    end
    meth2
  end
end

Test1.new.meth1

Но то есть не вложенный метод. Повторяю: Ruby не имеет вложенных методов .

Что это такое, это определение динамического метода. Когда вы запустите meth1, тело meth1 будет выполнено. Тело просто определяет метод с именем meth2, поэтому после запуска meth1 один раз вы можете вызвать meth2.

Но где определено meth2? Ну, очевидно, не определяется как вложенный метод, так как не являются вложенными методами в Ruby. Он определен как метод экземпляра Test1:

Test1.new.meth2
# Yay

Кроме того, он будет, очевидно, переопределяться каждый раз при запуске meth1:

Test1.new.meth1
# Yay

Test1.new.meth1.
# test1.rb:3: warning: method redefined; discarding old meth2
# test1.rb:3: warning: previous definition of meth2 was here
# Yay

Короче: no , Ruby не поддерживает вложенные методы.

Обратите также внимание на то, что в Ruby тела методов не могут быть закрытыми, только блокирующие тела могут. Это в значительной степени устраняет основной вариант использования вложенных методов, поскольку даже , если Ruby поддерживает вложенные методы, вы не могли использовать переменные внешнего метода во вложенном методе.


ОБНОВЛЕНИЕ ПРОДОЛЖЕНИЕ: на этапе later , этот синтаксис может быть повторно использован для добавления вложенных методов в Ruby, которые будут вести себя так, как я описал: они будут привязаны к их содержащему методу, т.е. невидимыми и недоступными вне тела их тела. И, возможно, у них будет доступ к лексическому охвату их содержательного метода. Однако, если вы прочитаете обсуждение, которое я связал выше, вы можете заметить, что matz сильно зависит от вложенных методов (но все же для удаления вложенных определений методов).

3
задан SDLUJO 15 January 2019 в 15:09
поделиться

1 ответ

fromPromise устарело, его больше нет в документации . Используйте from , чтобы получить наблюдаемое из обещания .

import { from } from 'rxjs';
let obs1 = from(this.diagnostic.isLocationAuthorized());
let obs2 = fromPromise(this.diagnostic.isLocationEnabled());
let obs3 = fromPromise(this.geolocation.getCurrentPosition());

Но подумайте, стоит ли это того, чтобы использовать его. Этот ответ поможет вам решить .

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

import { defer } from 'rxjs';
defer(async function() {
  const a = await promiseDelay(1000).then(() => 1);
  const b = a + await promiseDelay(1000).then(() => 2);
  return a + b + await promiseDelay(1000).then(() => 3);
})
.subscribe(x => console.log(x)) // logs 7

Но не забудьте, что Async-await и Observables не работают вместе . Отложите документы .

0
ответ дан Luillyfe 15 January 2019 в 15:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: