как правильно создавать обещания в node.js - PullRequest
0 голосов
/ 24 апреля 2019

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

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

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- UnhandledPromiseRejectionWarning: ReferenceError: обещание1 не определено.

2- UnhandledPromiseRejectionWarning: необработанное отклонение обещания.

3- UnhandledPromiseRejectionWarning: ReferenceError: ошибка не определена.

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

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

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

0 голосов
/ 24 апреля 2019

Вы используете объект promise1 в самой функции конструктора обещаний. По этой причине 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);
  });
...