Node.js - 如何使用回调调用异步函数?
Posted
技术标签:
【中文标题】Node.js - 如何使用回调调用异步函数?【英文标题】:Node.js - How do you call an async function with a callback? 【发布时间】: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() 中的第二个参数传递什么。或者,也许我一开始就错误地编写了第一个异步函数?
【问题讨论】:
最好使用异步等待 我已经用下面的测试代码提交了一个答案。如果它解决了您的问题,请批准答案。如果您遇到任何问题,请检查并告诉我? 【参考方案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');
);
【讨论】:
以上是关于Node.js - 如何使用回调调用异步函数?的主要内容,如果未能解决你的问题,请参考以下文章