在Observer中使用回调包装API承诺函数

时间:2018-02-09 18:32:18

标签: angular typescript rxjs

背景

我使用的API在每个函数上使用成功和失败回调。我在它上面扩展了一个包装层,它使用Promises来解释成功和失败的回调,但是有些函数需要额外的回调作为它们的参数,例如:

低级JS API

function addProgressListener(successCallback, failureCallback, progressCallback);

TypeScript Wrapper

function addProgressListenerAsync(progressCallback): Promise<boolean> {
  return new Promise((resolve, reject) => {
    addProgressListener(
      () => resolve(true),
      (err) => reject(err),
      progressCallback);
  });
}

在更高级别,我在async / await样式中使用它,但由于progressCallback将返回我想要附加到ProgressBar组件的多个值,我想将它包装在Observable中。

问题

如何在Observable中仅包装progressCallback部分?我无法将整个调用包装到addProgressListener,因为它正在以async / await方式使用,如下所示:

async function process(): Promise<any> {
  try {

    await addProgressListener((value) => {
       // Value = percentage complete
       // How do I get this value into an Observable that my component can bind to?
    }

    // ... do actual processing stuff
  }
  catch(err) {
  }

我原以为我可以在调用函数之前创建Observable,并以某种方式在回调中添加“observer.next(value)”调用,类似于我在这个问题上收到的答案Wrap API Call in Observable但是通过查看RxJS文档我没有看到将.next()回调添加到已创建的Observable实例的方法,只是在Observable.create的回调中(这需要我将调用包装到addProgressListenerAsync ...)。 p>

我也接受任何关于编写包装器以实现此目的的方法的建议,尽管Promise样式工作已经完成,因此重写整个事物以使用Observable可能不切实际。

0 个答案:

没有答案