Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6承诺有时无法解决问题_Javascript_Node.js_Es6 Promise - Fatal编程技术网

Javascript 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(

上下文:设备正在定期向我发送数据。当我收到这些数据时,我必须处理它们并将它们存储在数据库中。我们使用Node.js 6.11.0和库来查询数据库

我们存储这些数据,然后对它们进行一系列操作。因为我们必须等待数据库完成存储,所以我们依赖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()函数

问题:

有时,在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
   }
}