Nodejs
您的位置: 主页 > web前端文章 > 前端其他文章 >

Nodejs异步编程简单技巧【访问量:56】

Node.js最重要的亮点之一是它是异步的。同时,如果不知道如何管理嵌套的异步回调函数,它的异步特性也可能成为它的致命弱点。 看看这段具有三层深度异步回调的代码。

var fs = require('fs');
var http = require('http');
var path = './headers.txt';

// i. check if headers.txt exists
fs.stat(path, function(err, stats) {
    if (stats == undefined) {
        // ii. fetch the HTTP headers
        var options = {
            host: 'www.wikipedia.org',
            port: 80
        };        
        http.get(options, function(res) {
            var headers = JSON.stringify(res.headers);
            // iii. write the headers to headers.txt
            fs.writeFile(path, headers, function(err) {
                console.log('Great Success!');
            });
        });    
    }
    else { console.log('headers already collected'); }
});

随着每一个级别越来越差。想象一下它有10层深!到目前为止,您一定已经认识到了异步回调问题。让我们看看我们如何解决它。 这个问题成为一个没有问题,使用一个名为Node.js的适当命名模块async。让我们来了解如何使用它。 首先安装async:

$ npm install async

现在这里是修改后的代码async:

var fs = require('fs');
var async = require('async');
var http = require('http');
var path = './headers.txt';

async.waterfall(
    [
        // i. check if headers.txt exists
        function(callback) {
            fs.stat(path, function(err, stats) {
                if (stats == undefined) { callback(null); }
                else { console.log('headers already collected'); }
            });
        },
        
        // ii. fetch the HTTP headers
        function(callback) {
            var options = {
                host: 'www.wikipedia.org',
                port: 80
            };        
            http.get(options, function(res) {
                var headers = JSON.stringify(res.headers);
                callback(null, headers);
            });
        },
        
        // iii. write the headers to headers.txt
        function(headers, callback) {
            fs.writeFile(path, headers, function(err) {
                console.log('Great Success!');
                callback(null, ':D');
            });
        }
    ],
    
    // the bonus final callback function
    function(err, status) {
        console.log(status);
    }
);

是不是很整齐?通过使用async,回调不会水平增长,它们垂直增长,非常像同步调用。 虽然async模块提供了许多其他有用的方法,但Node.js中只有两个足够用于异步回调 - series()而且waterfall()。 这两种方法都接受一个接一个地执行的函数数组,以及一个可选的回调函数,这个函数将在所有函数执行完毕后执行而没有任何错误。 series()和之间的区别在于,waterfall()函数series()依次执行,并且它们的结果存储在响应数组中的相应索引中,并将响应数组传递给可选的最终回调函数。在waterfall(),每个函数的结果被传递到下一个函数,最后一个函数的结果被传递给可选的最终回调函数。

2018-04-04
上一篇:Node.js请求模块
下一篇:Magento前端优化
匿名评论