簡體   English   中英

JavaScript 承諾不返回數據

[英]JavaScript Promise Not Returning Data

我正在嘗試為這個mysql 庫創建一個包裝器,以便我可以進行同步查詢。 我正在使用 Promise,出於某種原因,我在執行console.log()時得到了{} (請參閱代碼)。

var myq = require("mysql");
var conn;

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

exports.query = function(sql, values){
    return new Promise(function(resolve, reject){
        if(typeof values === "undefined"){
            this.conn.query(sql, function(err, r){
                if(err){
                    reject(r);
                }else{
                    resolve(r);
                }
            });
        }
    });
};

使用承諾:

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

那么,我是否正確使用了Promise

您第一次嘗試轉儲結果實際上是轉儲承諾本身而不是值: console.log(rows);

在不知道您使用的是哪個 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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM