Цепные обещания потом возвращаются наблюдаемым - PullRequest
0 голосов
/ 01 марта 2019

Это довольно запутанно.Я использую угловые (ионные) и вызываю два цепных обещания, а затем хотел бы вернуться так же, как показано ниже.Я попытался добавить return перед двумя обещаниями, но, конечно, выдает ошибку компиляции.

Type 'Promise<Observable<{ formInstanceId: any; questionId: any; repeatId: any; filename: any; isEquipment: any; }>>' is not assignable to type 'Observable<any>'.   Property '_isScalar' is missing in type 'Promise<Observable<{ formInstanceId: any; questionId: any; repeatId: any; filename: any; isEquipment: any; }>>'

Я думал об использовании из (promise 1) и from (promise 2), но потом это стало еще более запутанным ..

Основная причина, по которой я хочу изменить это на полностью наблюдаемое, потому что я хочу использовать timeout () в post () в конце кода ниже

public uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment): Observable<any> {

    this._file.resolveLocalFilesystemUrl(filePath).then(result => {
    console.log("fileSelected", result);

    let fileName = result.name;
    let nativeURL = result.nativeURL;
    let path = nativeURL.substring(0, nativeURL.lastIndexOf("/"));

    this._file.readAsArrayBuffer(path, fileName).then(buffer => {
      let imgBlob = new Blob([buffer], {type: "image/jpeg"});

      let params = {fileName: 'attachment'};
      let query = this.encodeQueryData(params);

      let uploadFileURL = this._networkService.serverUrl + '/api/upload?' + query;


      return this._networkService.postFile(uploadFileURL, fileName, imgBlob).pipe(map(response => {
          console.log(response);
          return {
            formInstanceId: formInstanceId,
            questionId: questionId,
            repeatId: repeatId,
            filename: response[0].filepath,
            isEquipment: isEquipment
          };
        },
        error => {
          return throwError(error);
        }
      ));


    });
  })

}

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете использовать оператор from из RxJs, который преобразует любое Обещание в Observable и далее связывает его (возможно, используя flatMap).См .: https://www.learnrxjs.io/operators/creation/from.html

Подобные вопросы отвечают здесь:

Возврат Наблюдаемый внутри Обещания

Как вернуть Наблюдаемый после некоторого Обещания получитьразрешен в Ionic 2 / Angular 2? (упомянутый здесь оператор fromPromise следует заменить новым оператором from)

Другой вариант - использовать ключевые слова async await в Typesript /ES6.Где бы вы ни вызывали метод uploadFile, просто используйте (await uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment)), который вернет наблюдаемую информацию, которая была возвращена методом networkService.postFile().

Ваш метод станет:

 public async uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment): Promise<Observable<any>> {

    const result = await this._file.resolveLocalFilesystemUrl(filePath);
    console.log("fileSelected", result);

    let fileName = result.name;
    let nativeURL = result.nativeURL;
    let path = nativeURL.substring(0, nativeURL.lastIndexOf("/"));

    const buffer = await this._file.readAsArrayBuffer(path, fileName);
    let imgBlob = new Blob([buffer], {type: "image/jpeg"});

    let params = {fileName: 'attachment'};
    let query = this.encodeQueryData(params);

    let uploadFileURL = this._networkService.serverUrl + '/api/upload?' + query;

    return this._networkService.postFile(uploadFileURL, fileName, imgBlob).pipe(map(response => {
        console.log(response);
        return {
        formInstanceId: formInstanceId,
        questionId: questionId,
        repeatId: repeatId,
        filename: response[0].filepath,
        isEquipment: isEquipment
        };
    },
    error => {
        return throwError(error);
    }
    ));
}

Вот какВы потребляете его:

(await uploadFile(formInstanceId, questionId, repeatId, filePath, isEquipment)).subscribe(result=> { /* ...Your code here... */ });

Асинхронное ожидание: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-1-7.html

...