Dexie - ToArray() **类型 'Promise[]>' 不可分配给类型“[]”。**

Dexie - ToArray() **Type 'Promise[]>' is not assignable to type '[]'.**

要求 return 来自 localdb 的两个简单数组。

函数为:

public getCaricamentoVeloceConf(): Observable<any> {
    let res = new RespOrdiniGetsceltecaricamentoveloce();

    res.tipo = this._WebDBService.Configurazione_CV_Scelte.toArray();
    res.ordinamento = this._WebDBService.Configurazione_CV_Ordinamento.toArray();

    return Observable.of(res);
  }

我得到的错误信息是:

类型 'Promise' 不可分配给类型 'Tipo[]'

我认为这是因为 ToArray() 函数 return 是一个承诺。

实际上我需要的是,用两个数组组成 res 对象,但我不知道如何结合这两个 promise toArray() 方法

有什么解决办法吗?

试试这个:

import 'rxjs/add/observable/fromPromise'; 
import { Observable } from "rxjs/Observable";

public getCaricamentoVeloceConf(): Observable<any> {   
    var res = new RespOrdiniGetsceltecaricamentoveloce();
    return Observable.fromPromise(
        this._WebDBService.Configurazione_CV_Scelte.toArray().then(tipo => {     
            res.tipo = tipo;
            return this._WebDBService.Configurazione_CV_Ordinamento.toArray();
        }).then(ordinamento => {
            res.ordinamento = ordinamento;
            return res;
        })
     );
  }

IndexedDB 是 asynchronous,因此预计返回值将是结果的承诺,而不是结果本身。

对于 TypeScript 和 ES2017,处理 promises 的自然方式是 async..await。如果该方法应该与 observables 一起使用,则应将 promises 转换为 observables。由于 RxJS 提供了比 ES6 承诺的更广泛的控制流功能,因此尽早完成它是有意义的,例如forkJoinPromise.all 的工作方式类似,接受 promises 和完整的 observables 作为来源:

  public getCaricamentoVeloceConf(): Observable<any> {
    return Observable.forkJoin(
      this._WebDBService.Configurazione_CV_Scelte.toArray(),
      this._WebDBService.Configurazione_CV_Ordinamento.toArray()
    )
    .map(([tipo, ordinamento]) => Object.assign(
      new RespOrdiniGetsceltecaricamentoveloce(),
      { tipo, ordinamento }
    ))
  }