Javascript ES6承诺有时无法解决问题
上下文:设备正在定期向我发送数据。当我收到这些数据时,我必须处理它们并将它们存储在数据库中。我们使用Node.js 6.11.0和库来查询数据库 我们存储这些数据,然后对它们进行一系列操作。因为我们必须等待数据库完成存储,所以我们依赖ES6承诺 下面是一个代码示例 首先,代码中获取数据的部分Javascript ES6承诺有时无法解决问题,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,上下文:设备正在定期向我发送数据。当我收到这些数据时,我必须处理它们并将它们存储在数据库中。我们使用Node.js 6.11.0和库来查询数据库 我们存储这些数据,然后对它们进行一系列操作。因为我们必须等待数据库完成存储,所以我们依赖ES6承诺 下面是一个代码示例 首先,代码中获取数据的部分 processData(data).then(result => { doSomethingElse(result) }).catch(error => console.log(
processData(data).then(result => {
doSomethingElse(result)
}).catch(error => console.log(error));
processData(),它是我们在数据库中存储数据的函数
function processData(data){
return new Promise((resolve,reject)) => {
pg.query('select query',[parameters],(err,res) => {
if(err) {
reject('something went wrong');
} else {
// Do a bunch of stuff
pg.query('insert data query',[parameters2],(er,rs) => {
if(er){
reject("Unable to save data");
}else {
console.log("Data Stored");
try{
//An object containing the result and other stuff
let results = {a:rs.rows[0],b:'...',c:'....'};
if(results.a.key){
//Do a bunch of other stuff for this type of data
// involving promises and resolving
} else{
resolve(results);
}
}catch(exception) {
reject(exception);
}
})
}
});
});
}
此函数处理两种类型的数据:一种是在解析之前执行一系列其他操作的数据,另一种是直接解析的数据。我们将两者都存储在数据库中,为了区分它们,我们使用result.a.key的值,对于第一种类型,该值不会为“null”
因为问题只涉及第二种类型(我们直接解决的类型),所以我认为在if中指定代码是没有用的
最后是doSomethingElse()函数
问题:
有时,在10%的情况下,承诺既不是拒绝也不是解决
- 它没有解析,因为它没有显示doSomethingElse()中的消息“我们正在做其他事情”(应该是因为result.b.foo&&result.b.bar对于来自同一设备的两个数据始终是相同的值)
- 它不会拒绝,因为我们在捕获中没有得到任何类型的错误
- 这是随机的,对于两个在任何方面都相似的数据,有时有效,有时无效
- 它被保存在数据库中,因为我们得到了“数据存储”消息李>
- 对于第一类数据,它从不这样做
作为一个创可贴解决方案,我们将DoMoToSuthEffice()函数放在解析之上,并重构代码以配合它。而且……它起作用了。它在所有情况下都能正常工作
我不知道接下来会发生什么,也许我不理解承诺,因为我看不出我们之前做的有什么重大区别 你知道发生了什么事吗?这是怎么发生的?我怎样才能解决这个问题谢谢你很可能是
中的代码对这类涉及承诺和解决的数据做了很多其他事情
是罪魁祸首-我认为“存储的数据”
总是记录到控制台上吗?@JaromandaX我也这么认为,但在检查了会触发if的字段后,它是“null”,所以它不应该出现在代码的这一部分。是的“存储的数据”
始终是loggedcan您可以在let results={..}
和if(results.a.key){
-老实说,我每隔一行放一个console.log只是为了看看发生了什么:pDon't“做一堆事情”在非承诺回调中。使用拒绝
和解析
,但不在承诺回调中使用任何其他内容。@Shypoop否,使用承诺链接进行多个查询,每个异步调用创建一个承诺。做太多的事情很容易忘记在正确的点上解析,而且该代码中的错误也不会出现t捕获(与然后回调中的代码错误不同)。
function doSomethingElse(result) {
//Only do something if those key exist
if(result.b.foo && result.b.bar) {
console.log('We are doing some other stuff');
//Do Something Else
}
}