javascript - 如何在 node.js 中正确创建 Promise
问题描述
我目前正在做一个项目,我需要异步制作一些功能。
我搜索了一下,我发现 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- UnhandledPromiseRejectionWarning: ReferenceError: promise1 未定义。
2- UnhandledPromiseRejectionWarning:未处理的承诺拒绝。
3- UnhandledPromiseRejectionWarning:ReferenceError:未定义错误。
请注意,我已经使用命令“npm install Promise”在 VS 代码中安装了 Promise 包,但仍然出现相同的错误。我该怎么办?
解决方案
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