node(async原理)

node中的async是用来实现同步操作的,提供包括map、Series等方法,本文不做赘述。

由于项目需要在浏览器端用了async.js,因此仔细看了下它的代码。原来,一直以为node是在服务端调用了操作系统的锁等同步机制,现在才知道并非如此。

主要针对需要串行执行的函数,核心实现如下:

async.eachOfSeries = function (obj, iterator, callback) {
    obj = obj || [];
    var nextKey = _keyIterator(obj);
    var key = nextKey();
    function iterate() {
        var sync = true;
        if (key === null) {
            return callback(null);
        }
        iterator(obj[key], key, function (err) {
            if (err) {
                callback(err);
            }
            else {
                key = nextKey();
                if (key === null) {
                    return callback(null);
                } else {
                    if (sync) {
                        async.nextTick(iterate);
                    } else {
                        iterate();
                    }
                }
            }
        });
        sync = false;
    }

    iterate();
};

本质上就是一个递归,其中async.nextTick。在服务端会调用node process的方法,如果直接在浏览器端用,调用的是setTimeout(fn, 0).

时间: 2024-10-16 19:08:01

node(async原理)的相关文章

Spring @async原理

Spring中@Async用法总结 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法. 1.  何为异步调用? 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者

node.async.auto

资料 GITHUB async ASYNC详解—from csdn nodejs的高性能与灵活性让服务端开发变得有了些乐趣,最近在看nodejs在服务端的一些应用,觉得其npm下的众多开源包让其虽没有大型的框架 却能更自由的引用外部的模块编写属于自己风格的代码架构. 学习过程中,最让人觉得头痛的地方,个人觉得是异步执行,习惯了顺序执行代码的开发过程,开始的时候,因为面向对象的思想,封装继承多态的理论已经深入各编程语言,所以在进行设计的时候,好好的跌了一个跟头,发现原本清晰的业务逻辑,在执行后变得

node async基础1

async的基础使用 1 async each   语法格式each(collection, iteratee, [callback])   用途:遍历集合中的元素,并行对每个元素执行一定的操作,但是不保证执行顺序,结果不会传递给最终的callback函数(要传递结果,可选择async.map函数)   参数说明: collection是一个用于遍历的集合 iteratee(item, callback)遍历函数,需要传入一个callback函数 [callback]是一个可选的回调函数,当遍历

AsyncLocal和Async原理解读

AsyncLocal 的实现很简单,将AsyncLocal实例和当前线程的值以键值对的形式保存在Thread.CurrentThread.ExecutionContext.m_localValues.中.由于使用[ThreadStatic] 修饰了 Thread.CurrentThread属性对应的字段,所以实现了多个线程之间各自维护不同的一份数据.同时,在每一次修改AsyncLocal.Value的时候,都新建了ExecutionContext和IAsyncLocalValueMap对象并赋值

JavaScript AMD 模块加载器原理与实现

关于前端模块化,玉伯在其博文 前端模块化开发的价值 中有论述,有兴趣的同学可以去阅读一下. 1. 模块加载器 模块加载器目前比较流行的有 Requirejs 和 Seajs.前者遵循 AMD规范,后者遵循 CMD规范.前者的规范产出比较适合于浏览器异步环境的习惯,后者的规范产出对于写过 nodejs 的同学来说是比较爽的.关于两者的比较,有兴趣的同学请参看玉伯在知乎的回答 AMD和CMD的区别有哪些.本文希望能按照 AMD 规范来简单实现自己的一个模块加载器,以此来搞清楚模块加载器的工作原理.

微信小程序捕获async/await函数异常实践

背景 我们的小程序项目的构建是与web项目保持一致的,完全使用webpack的生态来构建,没有使用小程序自带的构建功能,那么就需要我们配置代码转换的babel插件如Promise.Proxy等:另外,项目中涉及到异步的功能我们统一使用async/await来处理.我们知道,小程序的onError 生命周期只能捕获同步错误,而完全不采用小程序自带构建工具的情况下,开发模式下遇到的问题: 小程序异步代码中的异常onError无法捕获,开发者工具控制台也没有抛出异常信息 这样在开发过程中页面展示异常,

async源码学习 - 全部源码

因为工作需要,可能我离前端走远了,偏node方向了.所以异步编程的需求很多,于是乎,不得不带着学习async了. 我有个习惯,用别人的东西之前,喜欢稍微搞明白点,so就带着看看其源码. github: https://github.com/caolan/async 文档:http://caolan.github.io/async/ 里面提供的工具方法,控制流程方法还是很多的.所以需要哪些方法,就看相应的源码. 下面是其全部源码. (function (global, factory) { typ

Node异步

一 Node异步工作原理 Node.js 异步编程的直接体现就是回调,回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数. 二 同步代码示例 先建立一个txt文件,写入: I am txt 再建立一个syn.js文件: var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log(&q

C#中await/async闲说

原文:C#中await/async闲说 自从C#5.0增加异步编程之后,异步编程越来越简单,async和await用的地方越来越多,越来越好用,只要用异步的地方都是一连串的异步,如果想要异步编程的时候,需要从底层开始编写,这样后边使用的时候就是异步,那么底层是如何实现??我们如何编写高效率的异步方法?? #了解基于任务的异步模式(TAP) 基于任务的异步编程模型 (TAP) 提供了异步代码的抽象化,你只需像往常一样将代码编写为一连串语句即可,在开始调用的地方运行.例如:var task = me