我目前正在一个项目上,我需要异步进行一些功能。
我进行了搜索,发现诺言将完成这项工作。这是我的代码:
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:未定义promise1。
2- UnhandledPromiseRejectionWarning:未处理的承诺拒绝。
3- UnhandledPromiseRejectionWarning:ReferenceError:错误未定义。
请注意,我已经使用命令“ npm install Promise”在VS代码中安装了promise软件包,但是仍然出现相同的错误。我该怎么办?
答案 0 :(得分: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
答案 1 :(得分:0)
您正在Promise构造函数本身中使用promise1
对象。这就是promise1
未定义错误的原因。
同样,如其中一条注释中所述,您不应该在then
函数内部使用resolve或reject函数。正确创建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);
});