Javascript承诺未定义

时间:2017-04-09 19:44:34

标签: javascript angularjs ionic-framework callback promise

我是Javascript和AngularJS的新手,我试图解决这个问题。 我做了一个角度服务,执行数据库查询并返回承诺。

        executeStatement = function(db, sql, values, onsuccess, onerror) {
        if (!!db.executeSql) {
            return db.executeSql(sql, values || [], onsuccess, onerror);
        } else {
            return db.transaction(function(tx) {
                return tx.executeSql(sql, values, function(ignored, rs) {
                    return onsuccess(rs);
                }, function(ignored, error) {
                    return onerror(error);
                });
            });
        }
    };

    this.executeStatement = function(sql, values) {
        $ionicPlatform.ready( function() {
            return new Promise(function(resolve, reject) {
                return executeStatement(myDB, sql, values, resolve, reject);
            });
        } );
    }

然后如果我在角度服务模块中调用executeStatement。

    this.extract = function(callback) {
        _DB.executeStatement('SELECT * FROM FRIDGE', []).then(callback);}

在功能运行完毕后,这不应该返回一个承诺吗? 我未定义:( 一些帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

this.executeStatement()函数需要返回$ionicPlatform.ready()的结果:

this.executeStatement = function(sql, values) {
    return $ionicPlatform.ready( function() {
        return new Promise(function(resolve, reject) {
            return executeStatement(myDB, sql, values, resolve, reject);
        });
    } );
}

现在您可以访问回调中executeStatement返回的任何内容,您可以将其作为参数传递给.then()函数:

_DB.executeStatement('SELECT * FROM FRIDGE', []).then(callback);

答案 1 :(得分:0)

executeStatement中的函数不是Promise,不需要returnonFulfilledonRejected Promise构造函数作为参数传递给函数,如果调用onsuccessonerror,则原始Promise将被解析或拒绝。

将第二个参数包含到已链接的.then()或使用.catch()来处理Promise链中的潜在错误。

不确定$ionicPlatform.ready是否会返回Promise

  _executeStatement = function(db, sql, values, onsuccess, onerror) {
    if (!!db.executeSql) {
        // `onsuccess` or `onerror` need to be called for `Promise`
        // to be fullfiled; a value needs to be passed to 
        // `onsuccess` or `onerror` to get the value at `.then()` or `.catch()`
        db.executeSql(sql, values || [], onsuccess, onerror); 
    } else {
        db.transaction(function(tx) {
            tx.executeSql(sql, values, function(ignored, rs) {
                onsuccess(rs);
            }, function(ignored, error) {
                onerror(error);
            });
        });
    }
  };

this.executeStatement = function(sql, values) {
    return $ionicPlatform.ready( function() {
             return new Promise(function(resolve, reject) {
               _executeStatement(myDB, sql, values, resolve, reject);
             })
             .catch(function(err) {
               // handle, pass error here
               console.log(err);
               return err
             })
           });
}

this.executeStatement(/* parameters */)
.then(function success(data) {
  console.log(data);
}, function err(err) {
  console.log(err);
});