如何在node.js中正确创建promise

时间:2019-04-24 08:04:59

标签: javascript sql node.js promise visual-studio-code

我目前正在一个项目上,我需要异步进行一些功能。

我进行了搜索,发现诺言将完成这项工作。这是我的代码:

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软件包,但是仍然出现相同的错误。我该怎么办?

2 个答案:

答案 0 :(得分:1)

1。 回调函数的主体中有promise1.then(...),它是promise1定义的一部分,这就是为什么得到ReferenceError的原因。基本上,您在初始化变量时尝试引用promise1。将promise1.then(...)移动到回调函数之外。

2。 您在这里的这段代码上紧接着有resolvereject

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