当前位置: 首页 > 面试题库 >

了解Javascript和Node.js中的回调

宓跃
2023-03-14
问题内容

我是一个长期的PHP(CodeIgniter和WordPress)开发人员,直到最近才想学习其他几种语言。我已经着手通过node.js学习Ruby(在Rails和Sinatra上),Python(在Flask框架下)和Javascript。

我决定使用每种语言创建一个我能想到的最基本的应用程序,即URL扩展器。除了node.js和Javascript,我已经设法用每种语言创建了一个工作版本。

我有点知道我的问题,我知道它与回调有关。我知道我做错了。我了解了回调的基本概念,但是我只是想不出如何解决我创建的这种混乱情况。

这是我的整个代码:

var http = require('http');
var url = require('url');
function expand() {
    var short = url.parse('http://t.co/wbDrgquZ');
    var options = {
        host: short.hostname,
        port: 80,
        path: short.pathname
    };
    function longURL(response) {
        console.log(response.headers.location);
    }
    http.get(options, longURL);
}

function start() {
    function onRequest(request, response) {
        console.log("Request received.");
        response.writeHead(200, {
            "Content-Type": "text/plain"
        });
        response.write("Hello World");
        expand();
        response.end();
    }
    http.createServer(onRequest).listen(8888);
    console.log("Server has started.");
}
start();

服务器启动,并在发出请求时调用扩展函数,该函数在终端中返回扩展的URL。我正在尝试使其在浏览器中打印。

任何帮助表示赞赏。提前致谢。


问题答案:

您已经犯了一些缺陷。

您应该重写expand以传递URL并传递回调。任何执行异步操作的函数通常(data, callback)在node
中都具有签名。这基本上可以让您说出我想让此功能执行某项操作,然后告诉我完成该操作的时间。

function expand(urlToParse, callback) {
    // note we pass in the url this time
    var short = url.parse(urlToParse);
    var options = {
        host: short.hostname,
        port: 80,
        path: short.pathname
    };
    // note we store the clientRequest object temporarily
    var clientRequest = http.get(options, extractRealURL);

    // Always attach the error handler and forward any errors
    clientRequest.on("error", forwardError);

    function extractRealURL(res) {
        callback(null, res.headers.location);    
    }

    function forwardError(error) {
        callback(err);    
    }
}

在这里,回调应该具有(err, data)节点中几乎所有回调都具有的签名。我们还添加了必须进行的错误处理。

现在,我们将onRequest更改为实际调用即可正确展开

function onRequest(request, response) {
    // parse the incoming url. true flag unpacks the query string
    var parsedUrl = url.parse(request.url, true),
        // extract the querystring url. 
        // http://localhost:8888/?url=http://t.co/wbDrgquZ
        urlToExpand = parsedUrl.query.url;

    // call expand with the url and a callback
    expand(urlToExpand, writeResponse);

    function writeResponse(error, newUrl) {
        // handle the error case properly
        if (error) {
            response.writeHead(500, { 'Content-Type': 'text/plain'});
            // early return to avoid an else block
            return response.end(error.message);
        }
        response.writeHead(200, { 'Content-Type': 'text/plain'});
        // write the new url to the response
        response.end(newUrl);
    }
}

在这里,我们添加了错误处理逻辑,还解压缩了实际的URL,以从查询字符串进行扩展。

通常doSomething<data, callback<err, result>>,node.js中的工作模式效果很好。

let result = doSomething<data> mayThrow err除了它是异步的之外,它与您在普通阻塞语言中所期望的完全相同。

请注意ServerResponse,通过这样做,您就无法通过将对象传递给函数的替代选项,从而在扩展函数和服务器响应之间创建了不必要的硬耦合。

扩展功能只应扩展一个URL并返回扩展的URL,它本身不做IO。

完整代码



 类似资料:
  • 问题内容: 据我了解,有三种调用异步代码的方法: 活动,例如 回调,例如 承诺 我找到了节点承诺库,但是我不明白。 有人可以解释什么是诺言,为什么我要使用它? 另外,为什么将它从Node.js中删除? 问题答案: node.js中的承诺承诺会做一些工作,然后有单独的回调,将为成功和失败以及处理超时而执行。在node.js中考虑promise的另一种方式是,它们是可能仅发射两个事件的发射器:成功和错

  • 问题内容: 我只是从node.js开始。我做了一些ajax的工作,但是没有什么太复杂的,所以回调仍然有点麻烦。我看了看异步,但我所需要的只是顺序运行一些功能。 我基本上有一些东西可以从API中提取一些JSON,然后创建一个新的JSON,然后对此进行处理。显然,我不能只运行它,因为它可以一次运行所有内容并且具有空的JSON。通常,流程必须按顺序运行,但是如果在从API中提取JSON时可以在等待时提取

  • 问题内容: 我了解将一个函数作为回调传递给另一个函数并让其执行,但是我不了解执行此操作的最佳实现。我正在寻找一个非常基本的示例,例如: 在myFirstFunction中,如果我确实返回了新的callback(),则它可以工作并执行匿名函数,但这对我来说似乎不是正确的方法。 问题答案: 你可以说 或者,如果要在回调中调整的值,则可以使用该方法。 函数内部将是任何东西。

  • 本文向大家介绍了解node.js中的npm脚本,包括了了解node.js中的npm脚本的使用技巧和注意事项,需要的朋友参考一下 到目前为止,我们正在使用以下命令运行App.js- 节点App.js 我们可以使用npm脚本来运行或调试我们的应用程序。 如何启动节点项目 命令是-npm init 上面的命令将启动一个项目,它将询问有关项目名称和启动文件名等的几个问题。 由于我们拥有App.js文件,因

  • 问题内容: 我需要从两个Web服务器请求数据。任务是独立的;因此,我正在使用aync.parallel。现在,我只在网页正文中写入“ abc”,“ xyz”和“完成”。 由于任务是同时执行的,我能否遇到奇怪的输出?例如, 代码。 问题答案: 如果要绝对确定结果的打印顺序,则应通过回调(第一个参数是错误)传递数据(和),并在最终的回调参数中处理/写入它们。

  • 有人能使用下面的示例数据解释JavaScript Truthy和Falsy吗?我读过其他线程,但仍然感到困惑。 根据我的理解,我认为var a=1 是唯一的真理,其余的都是虚假的-这是正确的吗?