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 - 如何使用回调调用异步函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js 流回调中聚合从异步函数生成的 Promise?

node.js异步回调

5Node.js 回调函数

Node.js 回调函数

node js 回调函数

Node.js 回调函数