【问题标题】:return new Promise never returns [duplicate]返回新的承诺永远不会返回[重复]
【发布时间】:2018-08-21 16:22:40
【问题描述】:

我试图在我的函数中使用promise,但它永远不会返回。这是我的代码:

function getData(id) {

  return new Promise(function(resolve, reject) {

      DbUtil.connection.query("my query... ", [id],
        function (error, results, fields) {
            if (error) {
              reject(error);
            } else {
              resolve(results);
            }
          }
        );
    }) 
}

查询有效,我可以在else 块中看到它的结果。但是函数本身不会返回。我尝试在resolve 和Promise 函数本身之后添加一个return 语句。但它仍然没有返回。

我错过了什么?

编辑:我怎么知道函数没有返回?因为

function main() {
    var data = getData(1);
    console.log("data returned? " + data); 
}

在上述main 函数中,从不调用日志语句。

【问题讨论】:

  • "但是函数本身并没有返回。" - 什么让你有那个想法?您需要提供minimal reproducible example。在您提供的代码中,您永远不会调用 getData,更不用说检查其返回值了。
  • @Quentin 我根据您的评论编辑了问题。
  • getData 返回一个承诺。你需要做getData().then(data => ...)。
  • "the log statement is never called" — 唯一会发生的情况是 (a) 你从不调用 main() 或 (b) 有一个例外,在这种情况下会有一条错误消息。

标签: javascript node.js promise


【解决方案1】:

这不是处理承诺的正确方式

试试这个:

var data;
getData(1).then(function(d) {
  console.log(d);
  data = d;
});
// Since a Promise is async, you can't log data here 

或

async function main() {
  var data = await getData(1);
  console.log(data);
}

请注意,此示例不处理 catch 大小写。

【讨论】:

  • 第一次使用var data 也是一种误导。是的,你可以这样做,但不,它可能不像你或 OP 所期望的那样工作。
  • 你能详细说明一下吗?例如,如何在 then 块内调用日志语句?
  • 这样更好吗?
  • 是的,这两个选项都有效。感谢您以简单有效的方式回答问题。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2015-11-04
  • 2016-10-20
  • 2018-06-03
  • 2015-02-13
  • 2019-04-21
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多