Node.js promise .then() не последовательность

#javascript #node.js #promise

#javascript #node.js #обещание

Вопрос:

он выполняется .then() number2 перед выполнением number1 . P.S. 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 = resu<
                      });
                  setTimeout(()=>{console.log("data before>",data);},1000);
                 }
              })
              .then(()=>{  //then 2
                console.log("data after>",data);
              })
              .catch((err)=>{console.log("error >",err)})
 }  

отобразить изображение

Комментарии:

1. вы получаете сообщение об ошибке. чего вы пытаетесь достичь. попробуйте добавить некоторые дополнительные детали.

2. setTimeout(()=>{console.log("data before>",data);},1000); никогда не приостанавливает выполнение, независимо от того, где оно находится (внутри обещания, а не внутри обещания, асинхронной функции и т. Д.)… вам нужно вернуть обещание, которое разрешается через 1 секунду, если вы хотите подождать

3. попробуйте return new Promise(resolve => setTimeout(()=>{console.log("data before>",data);, resolve()},1000));

4. также … использование таймаута для ожидания асинхронных данных — это не то, как вы это делаете

5. как это сделать правильно — pastebin.com/qCWwCgUW

Ответ №1:

Вы then неправильно используете. В первом then методе обработчика вы ничего не возвращаете, поэтому движок JS продолжит работу следующим then в цепочке. Обновите свой код, чтобы:

 function query(sql) {
  var data = [555, 555];
  getConnectIn()
    .then((check_connect) => { //then 1
      if (check_connect) {
        return new Promise((resolve, reject) => {
          connector.query(sql, function(err, result, fields) {
            If (err) { 
              reject(err);
            } else {
              resolve(result);
            }
          });
        });
      }
    })
    .then(result => { //then 2
      // now you can access result here!
      console.log("data after>", data);
    })
    .catch((err) => {
      console.log("error >", err)
    })
}  

Взгляните на страницу MDN, чтобы узнать больше о цепочке обещаний.

Комментарии:

1. я новичок в Stackoverflow, и я не знаю, как его использовать, но я хочу активировать ваш комментарий.

2. Потрясающе, не могли бы вы принять это как ответ в этом случае. Вы можете нажать на флажок под стрелками обновления в моем ответе, чтобы отметить его.

3. привет, мистер Дипен, у меня новая проблема, я хочу вернуть данные в функцию запроса, но это будет «Обещание { <ожидание> }», пожалуйста, помогите мне

4. Вам нужно подождать, пока обещание не будет выполнено, но вы все равно можете выполнить цепочку. Вы не против поделиться своим кодом?

Ответ №2:

В принципе, 1 затем сначала вызывается, но вы снова вызываете асинхронный метод (connector.запрос), который требует времени и передачи управления следующему вызову, а затем setTimeout передает процесс выполнения следующему, либо возвращает новое обещание при вызове setTimeout, либо использует second затем после вашего асинхронного соединителя.метод запроса (), подобный этому. здесь вам также не нужен тайм-аут

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