Node.js承诺.then()不排序

时间:2020-09-26 07:31:08

标签: javascript node.js promise

在number1完成之前先运行.then()number2。 附言getConnectIn()是承诺

function query(sql){
            var data = [555,555];
            getConnectIn()
               .then((check_connect)=>{   //then 1
                 if(check_connect){
                   connector.query(sql,function(err,result,fields){
                            data = result;
                      });
                  setTimeout(()=>{console.log("data before>",data);},1000);
                 }
              })
              .then(()=>{  //then 2
                console.log("data after>",data);
              })
              .catch((err)=>{console.log("error >",err)})
 }

display picture

2 个答案:

答案 0 :(得分:1)

您以错误的方式使用df1 = (df.assign(animal = df['animal'].where(df['animal'] == 'cat'), height = df['height'].where(df['height'] > 10), from1 = df['from'].where(df['from'] == 'breeder') ) .groupby(['Person']).agg( number_of_animal = pd.NamedAgg(column = 'animal', aggfunc = 'count'), number_of_from = pd.NamedAgg(column = 'from1', aggfunc = 'count'), total_height = pd.NamedAgg(column = 'height', aggfunc = 'sum'), total_weight = pd.NamedAgg(column = 'weight', aggfunc = 'sum') )) print (df1) number_of_animal number_of_from total_height total_weight Person John 2 1 0.0 17.8 Paul 0 1 34.0 205.5 Taylor 0 0 55.0 200.0 。在第一个then处理程序方法中,您什么都不返回,这就是为什么JS引擎将继续在链中的下一个then上运行的原因。将您的代码更新为:

then

看看MDN page,以了解有关承诺链的更多信息。

答案 1 :(得分:0)

基本上1,然后先调用,但再次调用异步方法(connector.query),这需要时间并控制传递给下一个调用,然后setTimeout将执行过程传递给next,或者在调用setTimeout时返回新的Promise,或者在您的调用之后使用第二个像这样的async connector.query()方法。这里你也不需要超时

function query(sql){
                var data = [555,555];
                getConnectIn()
                   .then((check_connect)=>{   //then 1
                     if(check_connect){
                       connector.query(sql,function(err,result,fields){
                               // data = result;
                          }).then((rslt)=>{  //then 2
                    console.log("data after>",rslt);
                        })
                  .catch((err)=>{console.log("error >",err)}
                     }
                  });
     }