Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有可观测参数的排队承诺_Javascript_Angular_Rxjs_Observable - Fatal编程技术网

Javascript 具有可观测参数的排队承诺

Javascript 具有可观测参数的排队承诺,javascript,angular,rxjs,observable,Javascript,Angular,Rxjs,Observable,我有一系列的承诺,我不想让他们开始,直到所有以前的承诺都解决了,但同时利用可观察的 我想试试这样的东西: let queue = Rx.Observable.create(); function addToQueue() { // How do I add this to the queue. } function removeFromQueue() { // How do i remove this item from the queue. } function getNewOb

我有一系列的承诺,我不想让他们开始,直到所有以前的承诺都解决了,但同时利用可观察的

我想试试这样的东西:

let queue = Rx.Observable.create();

function addToQueue() {
  // How do I add this to the queue.
}

function removeFromQueue() {
  // How do i remove this item from the queue.
}

function getNewObservable() {
  const queueItem = Rx.Observable.fromPromise(new Promise(resolve => {
    setTimeout(() => {
      removeFromQueue();
      resolve();
    }, 1000);
  }));

  addToQueue();
  return queue;
}

getNewObservable().then(() => console.log('After 1000'));
getNewObservable().then(() => console.log('After 2000'));

// This one shouldn't run until the top two are finished
getNewObservable().then(() => console.log('After 3000'));

// This one would just wait for the previous one to resolve since
// the first two already resolved
setTimeout(() => {
  getNewObservable().then(() => console.log('After 4000'));
}, 2500);

使用
concat
操作符

import { Component } from '@angular/core';
import { concat } from 'rxjs/observable/concat';
import { fromPromise } from 'rxjs/observable/fromPromise';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  constructor() {
    const p1 = Promise.resolve(1);
    const p2 = Promise.resolve(2);
    const p3 = Promise.resolve(3);

    const o1 = fromPromise(p1);
    const o2 = fromPromise(p2);
    const o3 = fromPromise(p3);

    concat(o1, o2, o3)
      .subscribe(console.log)
      // logs 1, 2, 3
  }
}

这只是
concatMap
操作符。唯一的问题是你在哪里做出承诺:

const queue = Rx.Observable.create();
const results = queue.concatMap(p => createPromise(p));

results.subscribe(console.log);

queue.add(getNewObservable(...));
queue.add(getNewObservable(...));
queue.add(getNewObservable(...));