Angular / Rx JS - преобразование обещания и внутреннего наблюдаемого в один единственный наблюдаемый, который будет возвращен - PullRequest
0 голосов
/ 04 августа 2020

У меня есть обещание, что после его выполнения создаст наблюдаемый объект и подписывается на него. Что мне нужно сделать, так это преобразовать это обещание в наблюдаемый и вернуть этот наблюдаемый объект для подписки в другом месте (который будет включать внутренний наблюдаемый). Я использовал from, чтобы преобразовать обещание в наблюдаемое, а затем использовал concatMap, чтобы связать внутреннее наблюдаемое. Однако в начале concatMap я получаю ошибку в моем коде для строковой переменной xfdfString, которую я пытаюсь получить из исходного обещания. Возможно, внутренняя наблюдаемая моя новая функция фактически не возвращает наблюдаемую? Я пробовал несколько вещей, чтобы решить эту проблему, но безуспешно, поэтому любые идеи будут очень признательны.

Ошибка:

Argument of type '(xfdfString: string) => void' is not assignable to parameter of type '(value: string, index: number) => ObservableInput<any>'.
  Type 'void' is not assignable to type 'ObservableInput<any>'.ts(2345)

Исходная функция:

  save() {
    const { annotManager } = this.wvInstance;
    annotManager.exportAnnotations({ links: false, widgets: false }).then(xfdfString => {
      const requestId = (<SignatureDocumentData>this.task.actionData).requestId;
      const data: SignDocument = { encodedDocument: encodeBase64(xfdfString) };

      this.documentService.signDocument(requestId, data)
        .pipe(
          switchMap(signResponse => this.workflowService.completeAction(this.task.id)),
          switchMap(nextTask => {
            if (!nextTask) {
              return this.workflowService.completeFolder();
            } else {
              return observableOf(nextTask);
            }
          }),
        ).subscribe(response => console.log(response));
    });
  }

Моя попытка использовать наблюдаемую более высокого порядка, чтобы вместо этого вернуть одну наблюдаемую:

save(): Observable<any> {
  const { annotManager } = this.wvInstance;

  const docViewerobservable = from(annotManager.exportAnnotations({ links: false, widgets: false }));

  return docViewerobservable.pipe(
    concatMap(xfdfString => {
      const requestId = (<SignatureDocumentData>this.task.actionData).requestId;
      let data = { encodedDocument: encodeBase64(xfdfString) };
      

      this.documentService.signDocument(requestId, data)
      .pipe(
        switchMap(signResponse => this.workflowService.completeAction(this.task.id)),
        switchMap(nextTask => {
          if (!nextTask) {
            return this.workflowService.completeFolder();
          } else {
            return observableOf(nextTask);
          }
        })
      );
    })
  );
}

1 Ответ

1 голос
/ 04 августа 2020

Я думаю, вам просто нужно вернуть Observable, который вы создали внутри concatMap; -)

save(): Observable<any> {
  const { annotManager } = this.wvInstance;

  const docViewerobservable = from(annotManager.exportAnnotations({ links: false, widgets: false }));

  return docViewerobservable.pipe(
    concatMap(xfdfString => {
      const requestId = (<SignatureDocumentData>this.task.actionData).requestId;
      let data = { encodedDocument: encodeBase64(xfdfString) };
      

      return this.documentService.signDocument(requestId, data)
      .pipe(
        switchMap(signResponse => this.workflowService.completeAction(this.task.id)),
        switchMap(nextTask => {
          if (!nextTask) {
            return this.workflowService.completeFolder();
          } else {
            return observableOf(nextTask);
          }
        })
      );
    })
  );
}

В противном случае это выглядит хорошо!

...