打字稿链接承诺 [英] Typescript chaining Promises

查看:66
本文介绍了打字稿链接承诺的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果有人可以帮助解决以下打字稿错误,我将不胜感激.

谢谢.

我正在使用以下代码它有以下内容.它需要能够链接Promise.

line 26: dbPromise = _db.execute(sql)

当我尝试构建它时,我得到以下信息:

<块引用>

 ./app/pages/chats/SqlDatabase.ts 中的错误(26,9): 错误 TS2322: 类型 'Promise'不可分配到类型Promise".类型 'SqlResultSet' 不能分配给类型 'SqlDatabase'.SqlResultSet"类型中缺少属性_db".

我使用的是 Typescript 2.0.3 版.

代码:

import { isBrowser } from './platform';从 './SqlResultSet' 导入 { SqlResultSet };导出类 SqlDatabase {构造函数(私有_db:任何){}static open(name: string, initStatements: string[] = []): Promise{让 dbPromise = isBrowser().then(浏览器 => {const openDatabase = 浏览器?openBrowserDatabase : openCordovaDatabase;返回 openDatabase(name);});如果(initStatements.length === 0){返回 dbPromise;}让 _db: SqlDatabase;//执行第一条语句并捕获_dbdbPromise.then(db => {_db = db;返回 db.execute(initStatements.shift());});//依次执行所有其他语句(如果有)for (let sql of initStatements) {dbPromise.then(() => {dbPromise = _db.execute(sql)});}//只有在所有语句完成后才解析 _db返回新的承诺((解决,拒绝)=> {console.log('resolve: ', resolve);dbPromise.then(() => resolve(_db)).catch(reject);});}execute(statement: string, params: any[] = []): Promise{console.log('执行:' + 语句);返回新的承诺((解决,拒绝)=> {this._db.transaction(tx => tx.executeSql(statement, params, (tx, resultSet) => {console.log('执行:解析:',resultSet);解决(结果集);}, (tx, error) =>{拒绝(错误)}));});}}声明 var sqlitePlugin: any;函数 openCordovaDatabase(name: string): Promise{返回新的承诺((解决,拒绝)=> {if (typeof sqlitePlugin === '未定义') {拒绝(新错误('[ionix-sqlite] sqlitePlugin 全局对象未找到;您是否安装了 Cordova SQLite 插件?'));}const db = sqlitePlugin.openDatabase({姓名:姓名,位置:'默认'});console.info('[ionix-sqlite] 使用 Cordova s​​qlitePlugin');解决(新的SqlDatabase(db));});}声明函数 openDatabase(name: string, version: string, desc: string, size: number): any;函数 openBrowserDatabase(name: string): Promise{返回新的承诺((解决,拒绝)=> {尝试 {const db = openDatabase(name, '1.0', name, -1);console.info('[ionix-sqlite] 使用 WebSQL');解决(新的SqlDatabase(db));} 捕捉(错误){拒绝(错误);}});}

解决方案

错误是由于您尝试更改 dbPromise 的类型.
首次声明时:

let dbPromise = isBrowser().then(浏览器 => {const openDatabase = 浏览器?openBrowserDatabase : openCordovaDatabase;返回 openDatabase(name);});

编译器将类型引用到 Promise(基于错误),但随后您尝试分配其他内容:

dbPromise = _db.execute(sql)

属于 Promise 类型.
你可以这样解决:

let dbPromise: Promise= ...

或者你可以有两个不同的 promise 变量(即:dbPromise:PromiseresultPromise:Promise),这对我来说听起来更好.>

If anyone can help with the following Typescript Error, I would appreciate it.

Thanks.

I am making use of the following code where it has the following. It needs to be able to chain the Promise.

line 26:    dbPromise = _db.execute(sql)

When I try build it, I get the following:

ERROR in ./app/pages/chats/SqlDatabase.ts
(26,9): error TS2322: Type 'Promise<SqlResultSet>' is not assignable to type 'Promise<SqlDatabase>'.
  Type 'SqlResultSet' is not assignable to type 'SqlDatabase'.
    Property '_db' is missing in type 'SqlResultSet'.

I am using Typescript version 2.0.3.

code:

import { isBrowser } from './platform';
import { SqlResultSet } from './SqlResultSet';

export class SqlDatabase {

  constructor(private _db: any) { }

  static open(name: string, initStatements: string[] = []): Promise<SqlDatabase> {
    let dbPromise = isBrowser()
      .then(browser => {
        const openDatabase = browser ? openBrowserDatabase : openCordovaDatabase;
        return openDatabase(name);
      });
    if (initStatements.length === 0) {
      return dbPromise;
    }
    let _db: SqlDatabase;
    // execute the first statement and capture the _db
    dbPromise.then(db => {
      _db = db;
      return db.execute(initStatements.shift());
    });
    // execute all the other statements (if any) sequentially
    for (let sql of initStatements) {
      dbPromise.then(() => {
        dbPromise = _db.execute(sql)
      });
    }
    // resolve the _db only after all statements have completed
    return new Promise((resolve, reject) => {
      console.log('resolve: ', resolve);
      dbPromise.then(() => resolve(_db)).catch(reject);
    });
  }

  execute(statement: string, params: any[] = []): Promise<SqlResultSet> {
    console.log('execute: ' + statement);
    return new Promise((resolve, reject) => {
      this._db.transaction(tx => tx.executeSql(statement, params, (tx, resultSet) => {
        console.log('execute: resolve: ', resultSet);
        resolve(resultSet);
      }, (tx, error) => {
        reject(error)
      }));
    });
  }
}

declare var sqlitePlugin: any;

function openCordovaDatabase(name: string): Promise<SqlDatabase> {
  return new Promise((resolve, reject) => {
    if (typeof sqlitePlugin === 'undefined') {
      reject(new Error('[ionix-sqlite] sqlitePlugin global object not found; did you install a Cordova SQLite plugin?'));
    }
    const db = sqlitePlugin.openDatabase({
      name: name,
      location: 'default'
    });
    console.info('[ionix-sqlite] using Cordova sqlitePlugin');
    resolve(new SqlDatabase(db));
  });
}

declare function openDatabase(name: string, version: string, desc: string, size: number): any;

function openBrowserDatabase(name: string): Promise<SqlDatabase> {
  return new Promise((resolve, reject) => {
    try {
      const db = openDatabase(name, '1.0', name, -1);
      console.info('[ionix-sqlite] using WebSQL');
      resolve(new SqlDatabase(db));
    } catch (error) {
      reject(error);
    }
  });
}

解决方案

The error is due to the fact that you try to change the type of dbPromise.
When it is first declared:

let dbPromise = isBrowser()
      .then(browser => {
        const openDatabase = browser ? openBrowserDatabase : openCordovaDatabase;
        return openDatabase(name);
      });

the compiler refers the type to Promise<SqlDatabase> (based on the error), but then you try to assign something else:

dbPromise = _db.execute(sql)

which is of type Promise<SqlResultSet>.
You can solve it like so:

let dbPromise: Promise<any> = ...

Or you can have two different promise variables (i.e.: dbPromise: Promise<SqlDatabase> and resultPromise: Promise<SqlResultSet>) which sounds better to me.

这篇关于打字稿链接承诺的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆