#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);
});