2017-04-09 59 views
1

我新的Javascript和AngularJS,我试图弄清楚这一点。 我做了一个角色服务,执行数据库查询并返回承诺。的Javascript承诺不确定

 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);} 

不应该在函数完成运行后返回承诺吗? 我越来越不确定:( 一些帮助,将不胜感激

+0

是否'$ ionicPlatform.ready'返回'Promise'? – guest271314

+0

现在我做到了回报承诺,但它看起来像实际的数据库查询获取方式后完成,因此承诺不包含任何DB数据....我应该怎么办? – PowerLove

+0

_“但它看起来像实际的数据库查询完成后的方式,所以Promise不包含任何数据库数据”_哪个数据库查询?不知道你的意思是“之后的方式”?你在表示'返回db.executeSql(SQL,值|| []的onSuccess,onError的)',这是不传递给'onsuccess'或'onerror'?为什么有两个名为'executeStatement'的函数? – guest271314

回答

0

的功能都没有Promise,不需要是return版,其中onFulfilledPromise构造onRejected作为参数传递给函数,如果当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); 
}); 
+0

谢谢你帮助我!我接受了你的答案,我仍然坚持,当我在onsuccess(rs)之前添加一个日志时;这个日志出现在console.log(data) – PowerLove

+0

之后你卡在哪里? – guest271314

+0

我仍然没有得到为什么console.log(数据)在excutesql中的任何东西之前运行...当我在onsuccess(rs)之前添加日志语句后,它仍然出现在 – PowerLove

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); 
     }); 
    }); 
} 

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

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

谢谢! 因此,如果我想处理结果,回调函数中的对象列表,我该怎么做? – PowerLove

+0

已经更新了答案,包括如何使用'callback' - 只需传递给'.then()'函数的定义,不要调用它 – hackerrdave

+0

谢谢!但是我想在所有数据库查询完成后调用回调函数。它看起来不是这里的情况... – PowerLove