iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >node.js下when.js 的异步编程实践
  • 621
分享到

node.js下when.js 的异步编程实践

nodejs 2022-06-04 17:06:52 621人浏览 安东尼
摘要

假设一个业务场景: 通过rss地址,获取rss并保存于文件,rss地址保存于文件中。 完成该场景的业务需要完成3个任务: 1.从文件中读取rss地址。 2.获取rss。 3.保存于文件。 最后将这三个任务进

假设一个业务场景:

通过rss地址,获取rss并保存于文件,rss地址保存于文件中。

完成该场景的业务需要完成3个任务:

1.从文件中读取rss地址。

2.获取rss。

3.保存于文件。

最后将这三个任务进行整合。

准备:

存放rss地址的文件,address.txt。

Http://programmer.csdn.net/rss_programmer.html

任务1:

读取rss地址文件的内容并通过callback返回。

var getRssAddress = function(path, callback) {

  fs.readFile(path, {encoding: 'utf8'}, function (err, data) {

    callback(err, data);

  });

}

任务2:

通过rss地址get到rss,并通过callback返回错误或数据。

var getRss = function(url, callback) {

  var data = '';

  http.get(url, function(res) {

    res.on('data', function(chrunk) {

      data += chrunk;

    });

    res.on('end', function() {

      callback(null, data);

    });

  }).on('error', function(err) {

    callback(err, null);

  });

}

任务3:

将rss保存于文件并通过callback返回错误。

var saveRss = function(data, callback) {

  fs.writeFile('rss.txt', data, 'utf8', function(err) {

    callback(err);

  });

}

整合:

getRssAddress('address.txt', function(err, data) {

  if(err) {

    console.log(err);

    return;

  }

  getRss(data, function(err, data) {

    if(err) {

      console.log(err);

      return;

    }

    saveRss(data, function(err) {

      if(err) console.log(err);

    });

  });

});

上面的代码是全异步处理,使用最常见的callback处理异步逻辑的返回,好处是标准写法,大家都能容易接受;坏处是耦合性太强,处理异常麻烦,代码不直观,特别是处理业务逻辑复杂和处理任务多的场景,层层的callback会让人眼冒金星,代码难以维护。

Promise/A规范的实现之一when.js正是针对这样的问题域。

让我们来看一下改造后的代码。

任务1:

var getRssAddress = function(path) {

    var deferred = when.defer();

      fs.readFile(path, {encoding: 'utf8'}, function (err, data) {

        if (err) deferred.reject(err);

        deferred.resolve(data);

      });

return deferred.promise; }



任务2:

var getRss = function(url) {

  var deferred = when.defer();

    var data = '';

    http.get(url, function(res) {

      res.on('data', function(chrunk) {

        data += chrunk;

      });

      res.on('end', function() {

        deferred.resolve(data);

      });

    }).on('error', function(err) {

      deferred.reject(err);

    });

return deferred.promise; }

任务3:

var saveRss = function(data) {

  var deferred = when.defer();

  fs.writeFile('rss.txt', data, 'utf8', function(err) {

    if(err) deferred.reject(err);

    deferred.resolve();

  });

return deferred.promise; }


整合:

getRssAddress('address.txt')

  .then(getRss)

  .then(saveRss)

  .catch(function(err) {

    console.log(err);

  });

解释:

promise/A规范定义的“Deferred/Promise”模型就是“发布/订阅者”模型,通过Deferred对象发布事件,可以是完成resolve事件,或者是失败reject事件;通过Promise对象进行对应完成或失败的订阅。

在Promises/A规范中,每个任务都有三种状态:默认(pending)、完成(fulfilled)、失败(rejected)。

1.默认状态可以单向转移到完成状态,这个过程叫resolve,对应的方法是deferred.resolve(promiseOrValue);

2.默认状态还可以单向转移到失败状态,这个过程叫reject,对应的方法是deferred.reject(reason);

3.默认状态时,还可以通过deferred.notify(update)来宣告任务执行信息,如执行进度;

4.状态的转移是一次性的,一旦任务由初始的pending转为其他状态,就会进入到下一个任务的执行过程中。

按照上面的代码。

通过when.defer定义一个deferred对象。

var deferred = when.defer();
异步数据获取成功后,发布一个完成事件。

deferred.resolve(data);
异步数据获取失败后,发布一个失败事件。

deferred.reject(err);
并且返回Promise对象作为订阅使用。

return deferred.promise;
订阅是通过Promise对象的then方法进行完成/失败/通知的订阅。

getRssAddress('address.txt')
.then(getRss)
then有三个参数,分别是onFulfilled、onRejected、onProgress

promise.then(onFulfilled, onRejected, onProgress)
上一个任务被resolve(data),onFulfilled函数就会被触发,data作为它的参数.

上一个任务被reject(reason),那么onRejected就会被触发,收到reason。

任何时候,onFulfilled和onRejected都只有其一可以被触发,并且只触发一次。

对于处理异常,when.js也提供了极其方便的方法,then能传递错误,多个任务串行执行时,我们可以只在最后一个then定义onRejected。也可以在最后一个then的后面调用catch函数捕获任何一个任务的异常。

如此写法简单明了。

getRssAddress('address.txt')

  .then(getRss)

  .then(saveRss)

  .catch(function(err) {

    console.log(err);

  });

Promise给异步编程带来了巨大的方便,可以让我们专注于单个任务的实现而不会陷入金字塔厄运,以上代码仅仅是基本使用,when.js提供的功能远远不止本文提到的这些,具体参照官方api

--结束END--

本文标题: node.js下when.js 的异步编程实践

本文链接: https://www.lsjlt.com/news/12010.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • node.js下when.js 的异步编程实践
    假设一个业务场景: 通过rss地址,获取rss并保存于文件,rss地址保存于文件中。 完成该场景的业务需要完成3个任务: 1.从文件中读取rss地址。 2.获取rss。 3.保存于文件。 最后将这三个任务进...
    99+
    2022-06-04
    node js
  • Linux环境下Java异步编程的最佳实践?
    在Linux环境下,Java异步编程是一个非常重要的领域。异步编程可以提高Java程序的效率和响应能力,让程序能够更好地处理高并发和大量请求。本文将介绍Linux环境下Java异步编程的最佳实践,同时会穿插一些代码演示。 一、Java异步编...
    99+
    2023-10-15
    分布式 linux 异步编程
  • Laravel文件异步编程:PHP异步编程的最佳实践?
    在现代应用程序开发中,异步编程已成为一种越来越流行的技术。它可以提高应用程序的性能,使其更加可扩展,并改善用户体验。在PHP开发中,使用异步编程技术可以将代码的执行从阻塞模式切换到非阻塞模式,从而提高应用程序的响应速度和吞吐量。 在这篇文...
    99+
    2023-10-05
    异步编程 文件 laravel
  • Linux下Python异步编程的最佳实践是什么?
    在如今互联网时代,高并发、高性能已经成为开发的基本要求。而异步编程正是解决这一问题的重要方式之一。Python是一种以简洁、易读性为主要特点的高级编程语言,也拥有强大的异步编程能力。本文将介绍Linux下Python异步编程的最佳实践。 ...
    99+
    2023-06-24
    异步编程 面试 linux
  • Linux 环境下 Java 异步编程的最佳实践是什么?
    在现代的软件开发中,异步编程变得越来越重要。Java 作为一种广泛使用的编程语言,提供了许多异步编程的方式和工具。在本文中,我们将讨论 Linux 环境下 Java 异步编程的最佳实践。 使用 CompletableFuture Ja...
    99+
    2023-10-02
    异步编程 javascript linux
  • PHP分布式异步编程:Linux系统下的最佳实践
    随着互联网技术的不断发展,分布式系统越来越受到人们的关注。而分布式系统的异步编程则是其中的重要组成部分。PHP作为一种广泛应用于Web开发的语言,也有着其独特的分布式异步编程方式。本文将介绍在Linux系统下,PHP分布式异步编程的最佳实...
    99+
    2023-11-07
    分布式 异步编程 linux
  • PHP中的线程池和异步编程实践
    近年来,PHP 开发者们开发出许多并发编程的技术,其中又以线程池和异步编程应用最为广泛。本文将介绍线程池和异步编程的基本概念以及它们在 PHP 中的实践应用。 一、线程池的概念线程池是一种并发编程领域中常见的技术。它是由一组线程组成的线程集...
    99+
    2023-05-23
    线程池 异步编程 PHP
  • Java编程中的异步编程实践,你掌握了吗?
    随着互联网技术的快速发展,越来越多的应用程序需要处理大量的数据和请求。在传统的同步编程模型下,这些请求需要在一个线程中依次处理,会导致程序性能下降和响应时间变长。而异步编程模型则可以通过并发处理多个请求,提高程序的性能和响应速度。本文将介...
    99+
    2023-08-17
    编程算法 异步编程 http
  • 异步编程中,Numpy在Linux平台下的最佳实践是什么?
    异步编程是现代软件开发中不可或缺的一部分,它允许我们在执行长时间运行的操作时不会阻塞主线程,从而提高应用程序的响应能力和性能。Numpy作为Python中最流行的科学计算库之一,也需要在异步编程中进行优化以提高其效率。本文将介绍在Linux...
    99+
    2023-10-16
    异步编程 linux numpy
  • leetcode刷题日志:Python异步编程实践
    LeetCode是一个专注于算法和数据结构的在线刷题平台,而Python异步编程是Python中的一个重要特性。本篇文章将会介绍如何通过Python异步编程来解决LeetCode中的一些问题。 一、Python异步编程的基础 Python的...
    99+
    2023-06-16
    leetcode 日志 异步编程
  • 异步编程与存储:PHP的实时应用实践
    随着计算机技术的不断发展,异步编程模式越来越被广泛应用。在PHP编程中,异步编程是一种非常重要的技术,可以提高程序运行效率和性能。本文将介绍异步编程与存储在PHP中的实时应用实践。 异步编程是什么? 异步编程是一种编程模式,它可以在程序执...
    99+
    2023-10-07
    实时 异步编程 存储
  • 异步编程:PHP和NumPy的文件操作实践。
    异步编程是现代计算机编程领域的一个重要议题,它可以大大提高程序运行效率和响应速度。在本文中,我们将探讨PHP和NumPy两个编程语言下异步编程在文件操作方面的实践。 一、PHP异步文件操作 PHP是一种广泛使用的服务器端脚本语言,它具有易学...
    99+
    2023-10-05
    numpy 异步编程 文件
  • PHP和NumPy:异步编程的最佳实践方法。
    PHP和NumPy:异步编程的最佳实践方法 随着互联网的发展,网站的复杂程度也在不断提高。为了应对高并发的访问量和处理大量的数据,异步编程成为了一种必不可少的技术。而PHP作为一门广泛应用于Web开发的语言,其异步编程的实现方式也备受关注。...
    99+
    2023-10-05
    numpy 异步编程 文件
  • Linux数组和PHP:异步编程的最佳实践
    在现代编程世界中,异步编程已经变得越来越普遍,因为它可以大大提高代码的性能和可扩展性。异步编程使程序能够执行多个任务,而不必等待每个任务都完成。Linux数组和PHP是两个非常强大的工具,可以帮助我们实现异步编程的最佳实践。 Linux数...
    99+
    2023-09-20
    linux 数组 异步编程
  • PHP 中的异步编程: Laravel 是最佳实践吗?
    PHP 中的异步编程:Laravel 是最佳实践吗? 随着互联网的发展,Web 应用程序的响应速度也越来越重要。而异步编程可以提高 Web 应用程序的响应速度,从而提高用户体验。PHP 作为一门常用的 Web 编程语言,也支持异步编程。在 ...
    99+
    2023-10-20
    关键字 异步编程 laravel
  • 大数据背景下的ASP网站异步编程实践与经验分享
    随着大数据时代的到来,越来越多的企业开始将自己的业务转移到了互联网上,通过建立网站来提供服务。而ASP网站作为一个老牌的网站开发技术,也在不断的发展和完善。在这篇文章中,我们将会重点探讨ASP网站在大数据背景下的异步编程实践与经验分享。 一...
    99+
    2023-11-07
    大数据 异步编程 http
  • Linux下Java异步编程:数据类型选择的最佳实践是什么?
    在Linux下,Java异步编程是一种非常常见的技术,它可以帮助我们更高效地处理大量的请求和数据。然而,在进行Java异步编程时,数据类型选择是非常重要的一点,因为它直接影响到程序的性能和稳定性。在本文中,我们将介绍一些最佳实践,帮助你选择...
    99+
    2023-09-16
    数据类型 linux 异步编程
  • Windows面试必备:ASP异步编程的实践经验?
    Windows面试必备:ASP异步编程的实践经验 ASP异步编程是现代Web应用程序开发中不可或缺的一部分。它可以增强程序的性能,使页面响应更加迅速。在ASP中,异步编程的实现可以通过使用异步Web服务,或者使用异步控件,如UpdatePa...
    99+
    2023-09-12
    异步编程 面试 windows
  • Java在分布式系统中的异步编程实践?
    Java在分布式系统中的异步编程实践 随着分布式系统的快速发展,异步编程已经成为了分布式系统中非常重要的一部分。Java作为一种广泛应用于分布式系统的编程语言,其异步编程技术也备受关注。在本文中,我们将探讨Java在分布式系统中的异步编程实...
    99+
    2023-10-15
    分布式 linux 异步编程
  • 大数据时代的Python异步编程实践指南
    在当今的大数据时代,数据量越来越大,数据处理的效率也越来越成为数据科学家和工程师们关注的焦点。Python作为一门高效的编程语言,越来越多的人开始使用它来处理大数据。而异步编程则是提高Python数据处理效率的重要方法之一。本文将介绍Py...
    99+
    2023-08-04
    索引 异步编程 大数据
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作