Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在node.js中正确创建承诺_Javascript_Sql_Node.js_Promise_Visual Studio Code - Fatal编程技术网

Javascript 如何在node.js中正确创建承诺

Javascript 如何在node.js中正确创建承诺,javascript,sql,node.js,promise,visual-studio-code,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) {

我目前正在做一个项目,我需要异步完成一些功能

我搜索了一下,发现承诺会起作用。这是我的密码:

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-未处理的PromisejectionWarning:ReferenceError:promise1未定义

2-未处理的PromisejectionWarning:未处理的承诺拒绝

3-未处理的PromisejectionWarning:ReferenceError:未定义错误

请注意,我已经使用命令“npm install promise”在VS代码中安装了promise包,但仍然收到相同的错误。我该怎么办?

1。 您有
promise1。然后(…)
在回调函数体中,它是
promise1
定义的一部分,这就是您得到
ReferenceError
的原因。基本上,在初始化变量时,您试图引用
promise1
。移动
promise1。然后(…)
到回调函数之外

#This is wrong
}).catch(error, function() {
    console.log(error);
});

#This is right
}).catch( function(error) {
    console.log(error);
});
二,。 在这段代码上,您有
解析
拒绝

resolve(isSIDInDB);
reject();
由于总是先调用
resolve
,因此永远不会调用此
reject

三,。 您需要将
error
变量传递给回调函数

#This is wrong
}).catch(error, function() {
    console.log(error);
});

#This is right
}).catch( function(error) {
    console.log(error);
});
首先解决这个问题,看看还有什么错误

此外,您可能希望阅读承诺,以便更好地理解它们:

您正在promise1对象中使用promise构造函数本身。这就是
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);
  });

在一个
。然后
承诺的方法中,你既不会拒绝也不会拒绝。您只需返回需要返回的任何内容。