【问题标题】:How can a promise be used to fix this? [duplicate]如何使用 Promise 来解决这个问题? [复制]
【发布时间】:2015-11-06 12:47:18
【问题描述】:

目标是让theQuery 函数处理查询并将行数组返回给result。在theQuery 函数中console.log 按预期工作,但记录结果日志undefinedundefined 日志首先出现在终端上。如何使用 Promise 来解决这个问题?

"use strict";
var pg = require('pg').native;
var connectionString = "...";
var client = new pg.Client(connectionString);
client.connect();

function theQuery(table,column) {
  client.query('SELECT * FROM "'+table+'" WHERE column = '+"'"+column+"';", function(err, result) {
      if(err) {
        return console.error('error running query', err);
      }
      console.log(result.rows);//works logs the rows
      return result.rows;
  });
}


  let Query = theQuery("table", "column);
  console.log(result);// logs undefined

【问题讨论】:

  • 您正试图从回调函数返回一个值。这表明对异步代码的深刻误解。请参阅重复的线程。
  • @Tomalak 我在stackoverflow.com/questions/14220321/… 尝试了解决方案,但我无法让它们工作,这就是为什么我特别询问承诺以及如何在这种情况下实现它们。
  • “我无法让他们工作”远远不足以继续下去。另一个线程详细介绍了异步编程的工作原理,你不可能在这么短的时间内尝试所有的东西。
  • 如何使用承诺在链接的问题中得到了准确的解释。还有更多信息的链接。请参阅“使用承诺”部分。这个例子再简单不过了。
  • pg-promise 已经在这里完成了您需要的一切。

标签: javascript node.js promise ecmascript-6


【解决方案1】:

这应该可行:

"use strict";
var pg = require('pg').native;
var connectionString = "...";
var client = new pg.Client(connectionString);
client.connect();

function theQuery(table,column) {
    return new Promise(function(fulfill, reject){
        client.query('SELECT * FROM "'+table+'" WHERE column = '+"'"+column+"';", function(err, result) {
            if(err) {
                reject(console.error('error running query', err));
            }
            console.log(result.rows);//works logs the rows
            fulfill(result.rows);
        });
    });
}


theQuery("table", "column).then(function(result){
    console.log(result);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-12
    • 2021-07-06
    • 1970-01-01
    • 2015-12-29
    • 2012-02-23
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多