как правильно создавать обещания в node.js

#javascript #sql #node.js #promise #visual-studio-code

#javascript #sql #node.js #обещание #visual-studio-код #visual-studio-code

Вопрос:

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

Я искал это и обнаружил, что promises выполнят всю работу. Вот мой код:

 var check = `SELECT * FROM change_name_spelling WHERE SID = ${SID}`;
isSIDInDB = false;

let promise1 = new Promise(function(resolve, reject) {
    con.query(check, function callback(err, result) {
        if (err) throw err;
        console.log('length: '   result.length);

        const error = false;

        if (!error) resolve(result.length);
        else reject('Rejected');

    });

    promise1
        .then(function(value) {
            if (value > 0) {
                isSIDInDB = true;
                console.log('is db, from query, '   isSIDInDB);
            } else {
                isSIDInDB = false;
                console.log('is Not in db, from query, '   isSIDInDB);
            }
            resolve(isSIDInDB);
            reject();
        })
        .then(function(value) {
            if (value) {
                console.log('in db');
            } else {
                console.log('not in db');
            }
        });
}).catch(error, function() {
    console.log(error);
});
  

Однако, когда я запускаю этот код, я получаю эти ошибки:

1- Необработанное PROMISEREJECTIONWARNING: ReferenceError: promise1 не определено.

2- Предупреждение о необработанном PROMISEREJECTIONWARNING: отклонение необработанного обещания.

3- Необработанное предупреждение Promiserejectionwarning: ReferenceError: ошибка не определена.

пожалуйста, обратите внимание, что я уже установил пакеты promise в VS code, используя команду «npm install Promise», но все еще получал те же ошибки. Что мне делать?

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

1. внутри .then метода обещания вы не решаете заново и не отвергаете. Вы просто возвращаете все, что вам нужно вернуть.

Ответ №1:

1. У вас есть promise1.then(...) в теле функции обратного вызова, которая является частью promise1 определения, поэтому вы получаете ReferenceError . По сути, вы пытаетесь ссылаться на promise1 при инициализации переменной. Переместитесь promise1.then(...) за пределы функции обратного вызова.

2. У вас есть resolve и reject друг за другом в этом фрагменте кода здесь:

 resolve(isSIDInDB);
reject();
  

Это reject никогда не будет вызвано, так как resolve всегда вызывается первым.

3. Вам нужно передать error переменную в функцию обратного вызова.

 #This is wrong
}).catch(error, function() {
    console.log(error);
});

#This is right
}).catch( function(error) {
    console.log(error);
});
  

Начните с исправления этого и посмотрите, какие ошибки остаются.

Кроме того, вы можете прочитать об обещаниях, чтобы лучше их понять:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Ответ №2:

Вы используете promise1 объект в самой функции конструктора promise. Это причина promise1 ошибки не определено.
Также, как упоминалось в одном из комментариев, вы не должны использовать функцию разрешения или отклонения внутри then функции. Эти функции будут недоступны даже после того, как вы правильно создадите promise1 объект

Пожалуйста, измените код на приведенный ниже и попробуйте один раз.

 var check = `SELECT * FROM change_name_spelling WHERE SID = ${SID}`;
isSIDInDB = false;

let promise1 = new Promise(function (resolve, reject) {
  con.query(check, function callback(err, result) {
    if (err) throw err;
    console.log('length: '   result.length);

    const error = false;

    if (!error) resolve(result.length);
    else reject('Rejected');
  })
});

promise1.then(function (value) {
  if (value > 0) {
    isSIDInDB = true;
    console.log('is db, from query, '   isSIDInDB);
  } else {
    isSIDInDB = false;
    console.log('is Not in db, from query, '   isSIDInDB);
  }
  if (isSIDInDB)
    return isSIDInDB;
  throw new Error(`not found`);
})
  .then(function (value) {
    if (value) {
      console.log('in db');
    } else {
      console.log('not in db');
    }
  }).catch(error, function () {
    console.log(error);
  });