Как имитировать обратный вызов с параметром функции обещания в rxjs?

Я абсолютный новичок в rxjs. Чтобы начать учиться мыслить наблюдаемыми, мне нужно переводить концепции с помощью примеров кода. Мне кажется, если я увижу код для этого, я смогу начать делать это самостоятельно с другими концепциями.

Я НЕ хочу ПРЕОБРАЗОВАТЬ обещание в наблюдаемое, я хочу создать новую реализацию с использованием Observable, которая может вести себя как обещание. Как мне переписать следующее, используя Observables?

 constructor(){
    let makeMessage2 = function(){
        return new Promise(resolve, reject){
           setTimeout(()=>{
                  var r = Math.random();
                  resolve("message two plus random value: " + r );
           }, 1000);
        }
    }
    this.logMessageAndResultOfCallback("message one!", makeMessage2);
}
private sideEffect1:string = "";
private sideEffect2:string = "";

logMessageAndResultOfCallback( message1:string, callback:Function ){
    console.log(message1);
    this.sideEffect1 = message1;

    callback().then((message2)=>{
          console.log(message2);
          this.sideEffect2 = message2;
    }
}

Я думаю, что часть, которую я не понимаю, - это как определить функцию «обратного вызова», как ее вызвать. Я понимаю, что дождусь завершения обработки или выдачи обработчиков, таких как makeMessage2().subscribe(message2 => console.log(message2));, но я понятия не имею, как определить makeMessage2.

Это может быть совершенно непонятный вопрос, но я прочитал около 10 различных вступлений к rxjs, и это не совсем понравилось. Мне просто нужно сопоставить этот сценарий с наблюдаемым шаблоном, и я думаю, что могу его понять.

По сути, я хочу определить наблюдаемую функцию myObs(), которая не «выполняется немедленно», а «выполняется» всякий раз, когда выполняется someMethod(message:string,obs:Observable). Когда myObs выполняется, он должен что-то делать в нем ансинхронно (например, получать результат HTTP-запроса), затем устанавливать следующее значение, затем запускать complete (), чтобы мой наблюдатель, определенный в someMethod, мог обработать завершение и сделать что-то с результатом .

Изменить: меня не интересуют таймер или нативные эквиваленты в rxjs, это просто для имитации любых асинхронных действий, таких как получение данных с сервера.


person FlavorScape    schedule 30.03.2017    source источник
comment
Observable.create выполняет функцию подписчика, которая выполняется для всех, кто подписывается. Это не работает для вас? Ваш вопрос не совсем ясен. На сайте документации rxjs есть хороший мастер о том, как начать наблюдение с разных вещей.   -  person aarosil    schedule 31.03.2017
comment
шаблон обратного вызова обещания также очень запутанный ... обычно это два разных подхода для асинхронного кода   -  person aarosil    schedule 31.03.2017
comment
Итак, я сделал свою попытку. Это кажется правильным?   -  person FlavorScape    schedule 31.03.2017
comment
Точнее, это потенциально два асинхронных поведения. В моем случае использования он отклоняет элемент пользовательского интерфейса после завершения вычисления обратного вызова, но не вызывает обратный вызов до тех пор, пока пользователь не начнет действовать.   -  person FlavorScape    schedule 31.03.2017
comment
Да вот что я имел в виду. Просто к сведению, хотя для этого примера, хотя вам вообще не нужен setTimeout, есть встроенный оператор rx delayTime   -  person aarosil    schedule 31.03.2017
comment
это просто для имитации некоторых асинхронных действий, таких как получение чего-либо с сервера и т. д. Я на самом деле не беспокоюсь о таймерах.   -  person FlavorScape    schedule 31.03.2017


Ответы (2)


Код, который вы написали и хотите «перевести» в наблюдаемые, вероятно, не будет работать. callback - это обещание, а не функция, поэтому вы не можете писать callback().

Вы тоже пробовали это введение? Это сработало для многих людей.

Чтобы ответить на ваш вопрос, вы можете написать

Rx.Observable.of(""message one!", "message two!")
  .map(console.log.bind(console)) // would be better to use `do` operator actually, for semantic reasons, but that works the same here
  .subscribe(noop, noop, noop)

or

Rx.Observable.of(""message one!", "message two!")
  .subscribe(console.log.bind(console), noop, noop)

где noop - это функция, которая ничего не делает, т.е. function noop(){}

Короче говоря, ваш поток передает данные, эти данные проходят через серию операторов, и поток данных запускается .subscribe. В вашем случае вам нечего делать по подписке, потому что все, что вы делаете, это логи.

Фактически, потоки Rxjs основаны на обратном вызове. Вы хотите проверить этот ответ понять это.

person user3743222    schedule 30.03.2017
comment
Упс, предназначен для создания функции, возвращающей обещание. Отредактированный код. Не думаю, что это то, что я ищу. Предполагаемый вариант использования - это функция, которая имеет некоторый начальный побочный эффект (регистрирует сообщение1) и требует, чтобы обратный вызов был вызван с асинхронным разрешением. Разрешение этого обратного вызова должно вызывать поведение / побочные эффекты, которые не зависят от внутренних компонентов функций обратного вызова. Я не просто пытаюсь напечатать два сообщения. - person FlavorScape; 31.03.2017
comment
Нет, мне нужны побочные эффекты. ваш пример не может этого сделать. Я только что сделал свой пример с конкретными побочными эффектами для иллюстрации. - person FlavorScape; 31.03.2017
comment
Я добавил свою попытку. похоже ли это соответствует шаблону, который я предлагаю? - person FlavorScape; 31.03.2017