Как я могу создать наблюдаемую информацию, подобную той, которую возвращает defer, используя Observable.create? - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь создать наблюдаемое с поведением, аналогичным тому, которое возвращает defer, но с использованием метода create. Поэтому я пытаюсь:

const obs = Observable.create(function(observer) {
   from(fetch('https://jsonplaceholder.typicode.com/todos/1').then(console.log('fetch done'))).subscribe(observer)
})

setTimeout(()=>obs.subscribe((resp)=>console.log(resp.statusText)), 5000)

Но когда я запускаю его в node Он просто печатает "fetch done" (по подписке, через 5 секунд, как и ожидалось), но ждет там вечно.

Когда я обертываю from(..) в setImmediate() или setTimeout(,0), то иногда он печатает оба сообщения («Fetch done», «OK») и выходит, а иногда он печатает только «fetch done» и ждет вечно.

код:

const obs = Observable.create(function(observer) {
    setTimeout(()=>from(fetch('https://jsonplaceholder.typicode.com/todos/1').then(console.log('fetch done'))).subscribe(observer), 0)
})

setTimeout(()=>obs.subscribe((resp)=>console.log(resp.statusText)), 5000)

Почему это происходит? Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Во-первых, Observable.create устарела, и вы должны использовать просто new Observable():

. При создании таких наблюдаемых объектов у вас есть доступ к observer объекту, где вы можете вызывать next() и * 1007. * так что в вашем случае это было бы так:

new Observable(observer => {
  fetch('https://jsonplaceholder.typicode.com/todos/1').then(response => {
    observer.next(response);
    observer.complete();
  });
});

Я думаю, что это также должно работать:

new Observable(observer => {
  const sub =  from(fetch('https://jsonplaceholder.typicode.com/todos/1')).subscribe(observer);
  // Return tear-down function so you can abort request.
  return () => sub.unsubscribe();
});

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

0 голосов
/ 19 февраля 2020

Promise.then принимает функцию обратного вызова, и вам нужно вернуть аргумент для ее цепочки, чтобы она стала then(result => { console.log('fetch done', result); return result; })

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