Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.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承诺不返回数据_Javascript_Node.js - Fatal编程技术网

JavaScript承诺不返回数据

JavaScript承诺不返回数据,javascript,node.js,Javascript,Node.js,我正在尝试为此创建一个包装器,以便可以执行同步查询。我正在使用承诺,由于某种原因,当我执行console.log()(请参阅代码)时,我得到了{} 使用承诺: require("./mysql.js"); // Create connection var conn = ....; // Make query var rows = conn.query("select * from groups"); // Dump the results console.log(rows); 现在,如果我

我正在尝试为此创建一个包装器,以便可以执行同步查询。我正在使用承诺,由于某种原因,当我执行
console.log()
(请参阅代码)时,我得到了
{}

使用承诺:

require("./mysql.js");
// Create connection
var conn = ....;

// Make query
var rows = conn.query("select * from groups");

// Dump the results
console.log(rows);
现在,如果我从等式中取出包装器,按照它们显示的方式进行,我会得到结果:

require("mysql");
// Create connection
var conn = ....;

// Make query
var rows = conn.query("select * from groups", function(err, rows){
    // Dump the results
    console.log(rows);
});

那么,我是否正确使用了
承诺?

您第一次尝试转储结果实际上是转储承诺本身,而不是值:
console.log(行)

在不知道您正在使用哪个Promise库的情况下,您可以执行以下操作:

var conn;
exports.connect = function(params){
  conn = myq.createConnection(params);
  return this;
};

exports.query = function(sql, values) {
  return new Promise(function(resolve, reject) {
    if (typeof values !== "undefined") {
      // not sure if you want to resolve or reject here
      resolve(undefined);
    }

   conn.query(sql, function(err, r) {
      if (err) {
        reject(r);
      } else {
        resolve(r);
      }
    });
  });
};
然后使用返回的承诺:

// Make query
var promise = conn.query("select * from groups");

// Dump the results
promise.then(function(results) {
  console.log(results);
}, function(err) {
  console.log(results);
});

现在最好的选择是使用async/await IMO:

const myFunction = async () => {
    try {
        const myPromise = await fetch( fetchParams, fetchObj );
        const anotherPromise = await myPromise.json();
        //etc...
    }
    catch(err){
        console.log(err);
    }
}

不;您在创建后立即将其记录下来。一个教程可能是个好主意。我正要开始这样做:第一件事是:承诺不会使代码同步,它们只是处理异步流的一种不同方式。如果它在回调中正常工作,那么我建议
conn.query
不是您认为的方法。最后,如果看不到您是如何创建连接的,我们就无法知道
conn
对象实际上是什么。您可以更新这个问题吗?您应该尝试类似conn.query(“select*from groups”)。然后(function(ans){rows=ans;})好的,但您只创建承诺。底部的示例显示它正在解析,具体地说,就是承诺创建下面的
then
调用。我推荐一个教程,不仅仅是带示例的API文档。这很有效,但它并不是我认为它应该做的。我想我需要做点什么,然后
yield
以获得
conn.query()
以同步/过程方式返回结果。如果你有任何想法如何使这个同步而不是异步,请让我知道!谢谢你的回答!我不明白你为什么要使这个同步,因为这将是阻塞行为。这样做会破坏使用node的一个主要优势,因为我不想要嵌套查询
const myFunction = async () => {
    try {
        const myPromise = await fetch( fetchParams, fetchObj );
        const anotherPromise = await myPromise.json();
        //etc...
    }
    catch(err){
        console.log(err);
    }
}