首页 > 解决方案 > 如何在 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 包,但仍然出现相同的错误。我该怎么办?

标签: javascriptsqlnode.jspromisevisual-studio-code

解决方案


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


推荐阅读