node Later定时任务
如何串行或者并行运行异步循环?
在使用循环处理异步的魔法之前,我们先来看下我们是怎么处理同步循环的。
同步循环
很久以前我写的循环是这样的:
for (var i = 0; i < array.length; i++) {
var item = array[i];
// do something with item
}
后来 JavaScript 提供了很多新的特性,现在我们会更倾向于用下面这种写法:
array.forEach((item) => {
// do something with item
})
在开发过程可能会有这么一种需求,我们需要在循环中异步处理 item,那么可以怎么做呢?
异步循环
如何在循环中使用 await?我们试着写一个异步函数,然后 await 每一次循环任务。
async function processArray(array) {
array.forEach(() => {
// define synchronous anonymous function
// it will throw error here
await func(item)
});
}
这个代码会抛出一个错误,因为我们不能在同步方法中使用 await, processArray 确实是异步函数,但是 array.forEach 里的匿名函数是同步的。
1. 不要等待结果
要处理这个问题,我们可以把这个匿名函数定义为异步的:
async function processArray(array) {
array.forEach(() => {
await delayedLog(item)
});
console.log('Done!');
}
但是这样的话 forEach 方法就相当于异步的了,不会等待遍历完所有的 item,例如下面这段代码:
function delay () {
return new Promise(resolve => setTimeout(resolve, 300));
}
async function delayedLog(item) {
// notice that we can await a function that returns promise
await delay();
// log item only after a delay
console.log(item);
}
async function processArray(array) {
array.forEach(() => {
await delayedLog(item)
});
console.log('Done!');
}
processArray([1, 2, 3]);
将会输出:
Done!
1
2
3
如果你不需要等待这个循环完成,这样就已经可以了。但是大部分情况我们还是需要等待这个循环完成才进行之后的操作。
2. 串行遍历
要等待所有的结果返回,我们还是要回到老式的 for 循环写法:
async function processArray(array) {
for (const item of arr) {
await delayedLog(item);
}
console.log('Done!');
}
最后的结果符合我们的预期:
1
2
3
Done!
上面这段的遍历代码是串行执行的,我们也可以把它换成并行的。
3. 并行遍历
我们可以稍微更改上面的代码来编程并行的:
async function processArray(array) {
// map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
// async 修饰的方法返回值是一个promise对象,因此下面map的返回值就是一个promise列表
const promiseArr = array.map(delayedLog);
// wait until all promises are resolved
await Promise.all(promiseArr);
console.log('Done!');
}
(注意:对于特别大的数组不建议使用这种写法,太多的并行任务会加重 CPU 和内存的负荷)
转自:https://zhuanlan.zhihu.com/p/31000936
node Later定时任务的更多相关文章
- node编写定时任务,for循环只执行一遍的解决办法
在用node编写定时任务时候,发现for循环只执行i=0这一次,就不接着循环执行了,下面贴上代码: exports.task = async function(ctx){ let { app } = ...
- node.js定时任务 node-schedule
先安装 node-schedule npm install node-schedule //1:确定时间 //例如:2014年2月14日,15:40执行 var schedule = require( ...
- node.js定时任务:node-schedule的使用
安装 npm install node-schedule 使用方法 1:确定时间 例如:2014年2月14日,15:40执行 var schedule = require("node-sch ...
- babeljs源码
babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...
- node定时任务——node-schedule模块使用说明
在实际开发项目中,会遇到很多定时任务的工作.比如:定时导出某些数据.定时发送消息或邮件给用户.定时备份什么类型的文件等等. 一般可以写个定时器,来完成相应的需求,在node.js中自已实现也非常容易, ...
- PHP定时任务实现(计划任务 vs node.js)
PHP自动任务(单线程) 一.计划任务实现 :最终需要在服务器(windows)上 设置计划任务 1.写好php任务文件 auto.php:链接数据库 判断条件操作数据库 2.创建bat文件 例:ru ...
- 【重学Node.js 第4篇】实现一个简易爬虫&启动定时任务
实现一个简易爬虫&启动定时任务 课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https://gith ...
- node.js中使用node-schedule实现定时任务
摘要:有时我们需要在每天的固定时间执行某个脚本,或者在某个固定时间执行某个任务.NodeJS中的 node-schedule 可以很好的实现定时任务. 1.安装 npm install node-sc ...
- node中的定时任务
node-schedule每次都是通过新建一个scheduleJob对象来执行具体方法. 时间数值按下表表示 * * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ | │ │ │ │ │ ...
随机推荐
- Ajax相同url的请求,IE缓存问题
最近做一个小项目,其中的一个页面如下,需要实现异步改变“是否推荐”的状态. 请求的代码如下: $.get("/Contorller/Edit", { id: id }, funct ...
- ios中的几种多线程实现
iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa ...
- GNU make 升级
网上下载新版本的make文件后 在make目录下 ./configure make make install mv make /opt/mv_pro_5.0.0/montavista/common/b ...
- 最近为毛喜欢上C/C++语言了
旁观者李四说:此人大笨也!我用鼠标随便拖几个控件, 就是一个xxx管理系统了,你用C语言怕是一年也写不出来吧! 好吧,我要承认,讲这话的都已经是mS的奴才了,别的我不了解, MFC本身就是一个封闭的架 ...
- java笔记--关于线程通信
关于线程通信 使用多线程编程的一个重要原因就是线程间通信的代价比较小 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.h ...
- 重写HashMap
package gov.gfmis.fap.util; import java.util.ArrayList; import java.util.HashMap; import java.util.L ...
- 对于(function(){}())和function(){}实例的作用域分析(里面有很多问题……)
今天在群里看到一个问题,让我纠结了好一会.下面是我的分析,感觉里面还有很多问题,关于作用域还是不太理解,希望大家看到问题第一时间反馈给我,看到实在受不了的地方说几句都没关系,谢谢. 请看题: 1.对象 ...
- ZeroMQ安装
一.ZeroMQ介绍 ZeroMQ是一个开源的消息队列系统,按照官方的定义,它是一个消息通信库,帮助开发者设计分布式和并行的应用程序. 首先,我们需要明白,ZeroMQ不是传统的消息队列系统(比如Ac ...
- linux /etc/rc.d/目录的详解
rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录. rcx.d/: 各个启动级别的执行程序连接目录.里头的东西都是指向init.d/的一些软连接.具体的后边叙述. 还有三个 ...
- ZBT的计算几何模板
Basic template 一个基础型模板包括一个向量的实现 DATE: 2015-06-01 #define op operator #define __ while #define _0 ret ...