Node 常用库 lodash 和 Promise

发布于 2021-11-28 10:23:01 字数 3222 浏览 1092 评论 0

作为函数式编程来说,流程控制和函数库是必不可少的(应该吧)。下面我们介绍两个常用的库。

lodash

完整的 api 请参阅,https://lodash.com/docs 。这里我们只演示几个简单的例子。安装:

E:\project\heron-lesson\demo4>npm install lodash --save
var data1 = [1, 2, 3, 4, 5];
var data2 = [
    {'user': 'barney', 'age': 36, 'active': true},
    {'user': 'fred', 'age': 40, 'active': false},
    {'user': 'pebbles', 'age': 1, 'active': true}
];

var _ = require('lodash');

// find 只会返回一条数据,没有条件默认返回第一条
var r1 = _.find(data1);
console.log(r1);  // -> 1

var r2 = _.find(data1, function (item) {
   return item > 2;
});
console.log(r2); // -> 3

var r3 = _.find(data2, function (item) {
   return item.age > 20;
});
console.log(r3); // -> { user: 'barney', age: 36, active: true }


// filter 返回所有满足条件的数据, 没有条件返回所有
var r4 = _.filter(data1);
console.log(r4); // -> [ 1, 2, 3, 4, 5 ]

var r5 = _.filter(data1, function (item) {
   return item > 2;
});
console.log(r5); // -> [ 3, 4, 5 ]

var r6 = _.filter(data2, function (item) {
    return item.age > 20;
});
console.log(r6); // -> [ { user: 'barney', age: 36, active: true }, { user: 'fred', age: 40, active: false } ]

我们演示了两个函数的用法,虚拟两个数组的数据,find 函数会返回数组的一个元素,filter函数会返回多条。这里需要注意的是,即使 filter 一条数据也没有返回,也会返回空数组 []。

关于流程控制

我们来看这个例子,我们先模拟两个异步函数。

var firstFn = function (callback) {
    setTimeout(function () {
        return callback('This is first task.');
    }, 200);
};
var secondFn = function (callback) {
    setTimeout(function () {
        return callback('This is second task.');
    }, 10);
};

接着看这样的写法。

firstFn(function (message) {
    console.log(message);
});
secondFn(function (message) {
    console.log(message);
});

结果是

This is second task.
This is first task.

并没有按照代码顺序得到结果。这是因为异步任务延迟的不同造成的。可以将顺序的函数套到前面的回调里,来达到预期的结果。像这样

firstFn(function (message) {
    console.log(message);
    secondFn(function (message) {
        console.log(message);
    });
});

然而,这样做的话,过多的嵌套,会让你的代码全是嵌套的括号,难以阅读和修改。

那么我们按照这个库来改进代码

E:\project\heron-lesson\demo4>npm install q --save

这是 Promise 标准的一个实现,我们可以编写 Promise 风格的代码了。

这种写法的每一步都返回 Promise,所以我们之前的 fn(err, data) 风格的函数也得改成 Promise 风格的。

var firstFn = function () {
    var defer = q.defer();
    setTimeout(function () {
        console.log('This is first task.')
        defer.resolve();
    }, 200);
    return defer.promise;
};
var secondFn = function () {
    var defer = q.defer();
    setTimeout(function () {
        console.log('This is second task.')
        defer.resolve();
    }, 10);
    return defer.promise;
};


var q = require('q');

firstFn()
    .then(function () {
        return secondFn();
    })
    .done(function () {
        console.log('done')
    });

得到结果

This is first task.
This is second task.
done

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
498 人气
更多

推荐作者

娇女薄笑

文章 0 评论 0

biaggi

文章 0 评论 0

xiaolangfanhua

文章 0 评论 0

rivulet

文章 0 评论 0

我三岁

文章 0 评论 0

薆情海

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文