Node 常用库 lodash 和 Promise

发布于 2021-11-28 10:23:01 字数 3222 浏览 1099 评论 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技术交流群

发布评论

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

关于作者

文章
评论
500 人气
更多

推荐作者

迎风吟唱

文章 0 评论 0

qq_hXErI

文章 0 评论 0

茶底世界

文章 0 评论 0

捎一片雪花

文章 0 评论 0

文章 0 评论 0

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