【问题标题】:call functions in async with node which is more recomended Q or callback与节点异步调用函数,这是更推荐的 Q 或回调
【发布时间】:2015-09-08 19:58:30
【问题描述】:

我的节点应用程序具有内部调用其他两个函数的函数,我想为它使用一些异步行为,推荐在这种情况下使用。 这个例子会很有帮助。

function myFunction(req,res){

//从这里这是我想在函数中使用warp的第一个地方

var dataChunks = [],
                dataRaw,
                data;

                req.on("data", function (chunk) {
                    dataChunks.push(chunk);
                });

                req.on("end", function () {
                    dataRaw = Buffer.concat(dataChunks);
                    data = dataRaw.toString();
                    console.log(data);

//这是我想在函数中扭曲并在第一个函数之后调用的第二个代码

 var filePath = 'C://test.txt';
                var writeStream = fs.createWriteStream(filePath, {flags: 'w'});
                writeStream.write(data);
                res.status(200).send('ok');

            })

}

还有一件事,正如我到目前为止所看到的,异步是节点框架的工作方式以及添加像 Q 这样的额外库不是矫枉过正吗?

【问题讨论】:

  • 您需要描述您要使用您拥有的代码解决的问题。 ,推荐使用 Promises 来管理 node.js 中的异步代码。您可以使用内置于 node.js 的 Promise 支持,或者您可以选择第三方库,如 Q 或 Bluebird(我最喜欢的是 Bluebird)。那是你的选择。那里没有正确或错误的答案,这取决于您喜欢什么,您认为哪些功能很重要,等等......添加一个库来帮助您管理异步代码并不过分。这是一个服务器进程 - 您不需要最小化使用的库。
  • @jfriend00-谢谢!代码正在做两件不同的事情:1.从请求正文中获取数据,2.将其(请求正文数据)写入文件,您如何推荐做吗?请提供示例,因为我是 asyhc 的新手......
  • @JhonDree 看起来你想要的是流,而不是承诺。
  • @thefourtheye- 谢谢,为什么是流媒体?可以举个例子吗?

标签: javascript node.js callback promise q


【解决方案1】:

我什至不明白你为什么特别需要承诺。

function myHandler(req, res) {
    var dataChunks = [],
        dataRaw,
        data;

    req.on("data", function (chunk) {
        dataChunks.push(chunk);
    });

    req.on("end", function () {
        dataRaw = Buffer.concat(dataChunks);
        data = dataRaw.toString();
        console.log(data);
        var filePath = 'C://test.txt';
        var writeStream = fs.createWriteStream(filePath, {flags: 'w'});
        writeStream.write(data);
        writeStream.on('finish', function() {
            res.status(200).send('ok');
        });
        writeStream.end();
    });
}      

或者,您可以将传入的流直接通过管道传输到您的文件流中并编写更少的代码。

function myHandler(req, res) {
    var filePath = 'C://test.txt';
    var writeStream = fs.createWriteStream(filePath, {flags: 'w'});
    req.pipe(writeStream);
    req.on("end", function() {
        res.status(200).send('ok');
    });
}        

【讨论】:

  • 非常感谢!!!投票了!我可以使用第二个有效的选项吗 1. 你能解释一下为什么你使用流而不是异步吗? 2. 我是否需要为此使用一些错误处理以及如何处理?
  • @JhonDree - req 已经是一个流。您已经在目的地使用流。 .pipe() 很自然地将一个传入流写入目标流。是的,您可能希望对写入流进行一些错误处理。您可以收听error 事件。
  • 感谢另一个问题,当我使用第二个有效的代码时,我收到了这个错误:TypeError: undefined is not a function at IncomingMessage. (c:\Users\i056926\WebstormProjects\ReverseProxyApp \server.js:50:25) 在 IncomingMessage.emit (events.js:129:20) 在 _stream_readable.js:908:16 在 process._tickCallback (node.js:355:11) 知道为什么吗?
  • 我在 res.status(200).send('ok');这是令人惊讶的
  • 可能 myHandler 函数的 res 参数实际上不是 http 响应对象,或者您输入错误并使用 req,而我的代码显示为 res
猜你喜欢
  • 2018-04-11
  • 2017-08-27
  • 2018-01-09
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2017-11-27
相关资源
最近更新 更多