ES6承诺有时无法解决

时间:2018-04-09 08:46:33

标签: javascript node.js es6-promise

上下文:设备定期向我发送数据。当我收到这些数据时,我必须处理它们并将它们存储在数据库中。我们使用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()(应该是因为result.b.foo&& result.b.bar对于来自同一设备的两个数据总是相同的值)。
  • 它不会拒绝,因为我们在捕获中没有任何错误
  • 它是随机的,因为两个数据在各个方面都很相似,有时它会起作用,有时却不起作用。
  • 它被保存在数据库中,因为我们正在获取"数据存储"信息。
  • 对于第一种类型的数据,它永远不会这样做。

作为创可贴解决方案,我们将doSomethingElse()函数置于解析之上,并重构代码以使用它。并且...它的工作原理。它100%的工作时间。

我不知道会发生什么,也许我不了解Promise的一些事情,因为我没有看到与我们之前所做的事情有任何重大差异。

您是否知道发生了什么,以及如何发生这种情况?我怎么能解决这个问题?

谢谢你

0 个答案:

没有答案