上下文:设备定期向我发送数据。当我收到这些数据时,我必须处理它们并将它们存储在数据库中。我们使用Node.js 6.11.0和库node-postgres来查询数据库。
我们存储这些数据,然后我们对它们进行一系列操作。由于我们必须等待数据库完成存储,我们依赖于ES6的承诺。
以下是代码示例。
首先,我们获取数据的代码部分
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()函数
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
}
}
问题:
有时,在10%的情况下,承诺既不会拒绝也不会解决。
作为创可贴解决方案,我们将doSomethingElse()函数置于解析之上,并重构代码以使用它。并且...它的工作原理。它100%的工作时间。
我不知道会发生什么,也许我不了解Promise的一些事情,因为我没有看到与我们之前所做的事情有任何重大差异。
您是否知道发生了什么,以及如何发生这种情况?我怎么能解决这个问题?
谢谢你