【问题标题】:Javascript Promise to Observable Translation Needed需要可观察翻译的 Javascript 承诺
【发布时间】:2020-04-24 21:14:18
【问题描述】:

我已尝试找到一个可以说明问题的示例,但在从一个翻译到另一个翻译时遇到了问题。将这个 Promise 转换为 Javascript Rxjs Observable 的好方法是什么?我意识到在现实世界中这样做可能很愚蠢,但这个练习更多的是关于我试图更多地理解 Promise(因为我对 Observables 的理解比 Promises 更好)。

编辑:我不想解决这个问题。我想通过专门使用 Rxjs observables 来解决这个问题。涉及零 Promise 或 toPromises。

    return new Promise((resolve, reject) => {
        setTimeout(() => {
            try {
                const result = fn();
                resolve(result);
            } catch (e) {
                reject(e);
            }
        }, time);
    });
}

promisifyTimeout(1000, () => {
    console.log('hello');
}).then(() => {
    console.log('done!');
}).catch((e) => {
    console.log('the thing failed! call support!');
});

【问题讨论】:

    标签: javascript promise rxjs


    【解决方案1】:

    为什么不直接使用函数中的 RxJs?

    const obs$ = from(promise);
    

    【讨论】:

    • 我不想让自己摆脱它......这违背了练习的意义。我想通过仅使用一种或另一种来比较两者以及它们的工作方式。
    【解决方案2】:
    const observable = new Observable(subscriber => {
      setTimeout(() => {
        try {
          const result = fn();
          subscriber.next(result);
          subscriber.complete();
        } catch (e) {
          subscriber.error(e);
        }
      }, 500);
    });
    
    observable.subscribe(console.log);
    

    更多信息here

    【讨论】:

    • 当我尝试运行这段代码时:“ReferenceError:结果未定义”。这不是 Rxjs 可观察的做事方式。一:Observables 使用 throwError
    • 是的,它的引用有误,已经编辑过了。而且它是一个真正的 rxjs 可观察对象,同样的演示可观察对象也可以使用运算符创建,例如 of(fn()).pipe(delay(500)),但与您在这里等待看到的承诺不太接近。无论如何,我希望这会有所帮助。
    【解决方案3】:

    使用timer:

    return timer(time).pipe(map(() => fn()))
    

    实际上应该就是你所需要的。

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2019-11-12
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      相关资源
      最近更新 更多