nodejs的同步工作插件async实际应用记录

前言

在使用nodejs使用过程中经常需要进行callback很多层才能完成最终功能,嵌套太深。这里使用async插件来替代嵌套。

我常用的async方法说明。async插件API位置https://github.com/caolan/async

series

series(task[, callback]);

  • task - 一个包含需要运行函数function的集合,每个函数都必须有一个callback(err, result)函数作为参数。
  • callback(err, result) – 当所有task函数执行完成之后将回调它,这个函数将得到一个result数组或对象,包含所有task通过自身回调函数传入的result。

例如:

async.series([
    function(callback){
        // do some stuff ...
        callback(null, 'one');
    },
    function(callback){
        // do some more stuff ...
        callback(null, 'two');
    }
],
// optional callback
function(err, results){
    // results is now equal to ['one', 'two']
});


// an example using an object instead of an array
async.series({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2}
});

each

each(coll, iteratee[, callback])

主要作用就是迭代coll中的元素,进行处理。

//存放每个房间中的所有card和jiracard,计算总的工作时间
var result = [];
async.eachSeries(rooms, function (room, done) {
	db.getAllCards('/' + room, function (res) {
		db.getAllJiraCards('/'+ room, function(jiraCards){
			var cards = res.concat(jiraCards);
			var totalTime = 0;
			if (cards != null && cards.length > 0) {

				for (var j = 0; j < cards.length; j++) {
					if(cards[j].statusIndex != 2){
						continue;
					}
					//调用了一个公共模块,主要是进行时间计算,可以忽略
					totalTime += util.calculateTime(cards[j].workTime);
				}
			}
			//在每一而room执行完成之后就将结果放入到result结果集中,因为这里的done回调函数
			//作用不大,我没有发现他的作用。
			result.push({room: room, totalTime: totalTime});
			done(null);
		});
	});
}, function (err) {
	//回调
	callback(result);
});

以上是在工作过程中用到的两种处理方式。根据api你可以选择一种适合自己的方式来完成相关工作。

 

转载于:https://my.oschina.net/u/1176977/blog/672652

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴回答您的问题。以下是使用 element-plus 组件在 Vue 页面上编写登录注册页面的示例代码: <template> <div class="login-register"> <el-form :model="form" ref="form" :rules="rules" label-width="80px"> <el-form-item label="用户名" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="form.password"></el-input> </el-form-item> <el-form-item label="确认密码" prop="confirmPassword"> <el-input type="password" v-model="form.confirmPassword"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('form')">注册</el-button> <el-button @click="resetForm('form')">重置</el-button> </el-form-item> </el-form> </div> </template> <script> import { ref } from 'vue'; import { ElForm, ElFormItem, ElInput, ElButton } from 'element-plus'; export default { components: { ElForm, ElFormItem, ElInput, ElButton, }, setup() { const form = ref({ username: '', password: '', confirmPassword: '', }); const rules = ref({ username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, { min: 3, max: 20, message: '用户名长度在 3 到 20 个字符之间', trigger: 'blur' }, ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, max: 20, message: '密码长度在 6 到 20 个字符之间', trigger: 'blur' }, ], confirmPassword: [ { required: true, message: '请确认密码', trigger: 'blur' }, { validator: (rule, value, callback) => { if (value !== form.value.password) { callback(new Error('两次输入的密码不一致')); } else { callback(); } }, trigger: 'blur', }, ], }); const submitForm = (formName) => { const form = this.$refs[formName]; form.validate((valid) => { if (valid) { console.log('提交成功'); } else { console.log('提交失败'); return false; } }); }; const resetForm = (formName) => { const form = this.$refs[formName]; form.resetFields(); }; return { form, rules, submitForm, resetForm, }; }, }; </script> <style scoped> .login-register { max-width: 400px; margin: auto; padding: 20px; } </style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值