【问题标题】:Node.js - How do you call an async function with a callback?Node.js - 如何使用回调调用异步函数?
【发布时间】:2020-06-04 10:41:12
【问题描述】:

下面的 async 函数应该检查一个 url 是否是一个合法的 url

let CheckUrl = function (url, done) {
  dns.lookup(url, function(err, address) { 
    if (err) return done(err);
    done(null, true); //return true because I don't care what the address is, only that it works
  });
} 

下面的 express.js 代码获取 url,但我无法理解如何编写 if 语句以使其返回 true 或 false。

// Gets URL 
app.post("/api/shorturl/new", function(req, res) {
  if (CheckUrl(req.body.url)) {
    // do something
  }
});

我不确定在这个 if 语句中作为 CheckUrl() 中的第二个参数传递什么。或者,也许我一开始就错误地编写了第一个异步函数?

【问题讨论】:

  • 最好使用异步等待
  • 我已经用下面的测试代码提交了一个答案。如果它解决了您的问题,请批准答案。如果您遇到任何问题,请检查并告诉我?

标签: node.js asynchronous mongoose callback


【解决方案1】:

请使用asyncawait

我已经为你写了一个测试代码如下:

const express = require('express');
const app = express();
const dns = require('dns');


let CheckUrl = function (url, done) {
    return new Promise((resolve, reject) => {
        dns.lookup(url, function(err, address) {
            console.log("err " , err)
            if (err) {
                resolve(false)
            } else {
                resolve(true)
            }

        });
    });
} 


app.post("/api/shorturl/new", async function(req, res) {

  try {

    let result = await CheckUrl(req.body.url);
    console.log("result " , result)
    res.send(result)
  }
  catch (error) {
    console.log("in catch error " , error)
    res.send(error)
  }
});

app.listen(3000)

您可以获得有关Promisehere的知识。 Promise 对象表示异步操作的最终完成(或失败)及其结果值。

【讨论】:

  • 谢谢。那我还需要 checkurl 函数中的 done 参数吗?
  • 这行不通。 CheckUrl 需要返回一个承诺。你必须dns.lookup()包装在一个promise中
  • @slebetman 我已经更新了答案.. 感谢您提供的信息。 :)
  • 谢谢。在 freecodecamp 中学习 mongoose 函数时,他们教导要继续写 'done' 或 'callback' 作为函数的最后一个参数。在这种情况下,它看起来甚至没有使用。您能否澄清为什么需要这样做,或者是否甚至需要这样做?我觉得现在有两个 Promise - 一个是 'done' 参数,它是 mongoose 中的回调,另一个是你写的 new Promise() ...
  • 谢谢。你是对的。我发现有很多更新。 v1 使用回调函数。 v2 使用 Promise 和 .then()。 v3 和当前 2020 年的最佳实践是 async/await,正如您在上面所写的。谢谢。
【解决方案2】:

正如 DeepKakkar 所提到的,这就是我想要的:

app.post("/api/shorturl/new", async (req, res) => {
  try {
    let result = await CheckUrl(req.body.url);
    res.send(result)
  }
  catch (error) {
    return new Error('Could not receive post');
  }
});

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 2012-06-03
    • 2019-01-20
    • 2018-01-04
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    相关资源
    最近更新 更多