nodejs 回调地狱解决 promise async

nodejs毁掉地狱是一直被人诟病的,以下总结一下解决毁掉地狱的一些方法。(暂时研究的比较浅)

1.promise

promise模式在任何时刻都处于以下三种状态之一:未完成(unfulfilled)、已完成(resolved)和拒绝(rejected)。以CommonJS Promise/A 标准为例,promise对象上的then方法负责添加针对已完成和拒绝状态下的处理函数。then方法会返回另一个promise对象,以便于形成promise管道,这种返回promise对象的方式能够支持开发人员把异步操作串联起来,如then(resolvedHandler, rejectedHandler); 。resolvedHandler 回调函数在promise对象进入完成状态时会触发,并传递结果;rejectedHandler函数会在拒绝状态下调用。(其中rejectedHandler可选)。

以下为一个有几级嵌套的函数,看起来比较令人恶心。(如果换成缩进四个字符可想而知)

‘use strict‘;
const md = require(‘markdown-it‘)();
const fs = require(‘fs‘);
fs.watchFile(‘nodejs.md‘, (curr, prev) => {
  let mdStr = fs.readFile(‘./nodejs.md‘, ‘utf-8‘, (err, data) => {
    let mdData = md.render(data);
    let htmlTemplate = fs.readFile(‘./index.html‘, ‘utf-8‘, (err, data) => {
      let html = data.replace(‘{{content}}‘, mdData);
      console.log(mdData);
      fs.writeFile(‘./nodejs.html‘, html, ‘utf-8‘, (err, data) => {
        if (err) {
          throw err;
        } else {
          console.log(‘OK‘);
        }
      });
    });
  });
});

一下用promise的方式实现同样的效果,首先把异步函数封装一下,然后下面可以指教调用。可能看起来代码比之前的版本更多,但是封装的异步函数是可以复用的。等任务多了就不显得代码多了。(但看最后调用函数的部分是不是优雅了不少)

‘use strict‘;
const fs = require(‘fs‘);
const md = require(‘markdown-it‘)();
var Q = require(‘q‘);

function fs_readFile(file, encoding) {

  var deferred = Q.defer();
  fs.readFile(file, encoding, function(err, data) {
    if (err) deferred.reject(err); // rejects the promise with `er` as the reason
    else
      deferred.resolve(data) // fulfills the promise with `data` as the value
  });
  return deferred.promise; // the promise is returned
}

function fs_writeFile(file, data, encoding) {
  var deferred = Q.defer();
  fs.writeFile(file, data, encoding, function(err, data) {
    if (err) deferred.reject(err); // rejects the promise with `er` as the reason
    else deferred.resolve(data); // fulfills the promise with `data` as the value
  });
  return deferred.promise ;// the promise is returned
    //return 1; // the promise is returned
}

function fs_watchFile(file, curr, prev) {
  var deferred = Q.defer();
  fs.watchFile(file, function(curr, prev) {
    if (!prev) deferred.reject(err); // rejects the promise with `er` as the reason
    else deferred.resolve(curr); // fulfills the promise with `data` as the value
  });
  return deferred.promise // the promise is returned
}

function markdowm_convert(file, encoding, mdData) {

  var convertData = md.render(mdData);
  console.log(convertData);
  var deferred = Q.defer();
  fs.readFile(file, encoding, function(err, data) {
    if (err) deferred.reject(err); // rejects the promise with `er` as the reason
    else {
      data = data.replace(‘{{content}}‘, convertData);
      deferred.resolve(data); // fulfills the promise with `data` as the value
    }
  })
  return deferred.promise; // the promise is returned
}

// ===============promise实现  =====================
fs_watchFile(‘nodejs.md‘)
  .then(function() {
    return fs_readFile(‘./nodejs.md‘, ‘utf-8‘);
  })
  .then(function(mdData) {
    return markdowm_convert(‘./index.html‘, ‘utf-8‘, mdData);
  })
  .then(function(data) {
    fs_writeFile(‘./nodejs.html‘, data, ‘utf-8‘);
  });

2.async

node的async包有多的数不清的方法我暂时只实验了一个waterfall

waterfall瀑布流的意思和async中另一个函数series差不多都是按照顺序执行,不同之处是waterfall每执行完一个函数都会产生一个值,然后把这个值给下一个函数用。

以下是嵌套了两级的读写文件程序

fs.readFile(‘01.txt‘,‘utf-8‘,function(err,date){
  fs.writeFile(‘02.txt‘,date,‘utf-8‘,function(err,date){
    console.log(‘复制完了‘);
  });
})

用async.waterfall 后代码如下

async.waterfall([
  function(cb){
    fs.readFile(‘01.txt‘,‘utf-8‘,function(err,result){
      cb(err,result);
    });

  },function(result,cb){
    fs.writeFile(‘02.txt‘,result,‘utf-8‘,function(err,result){
      cb(err,result);
    });
  }
  ],function(err,result){
 console.log(‘复制完了‘);
})
时间: 2024-10-09 18:55:59

nodejs 回调地狱解决 promise async的相关文章

js中promise解决callback回调地狱以及使用async+await异步处理的方法

1.callback回调地狱 function ajax(fn) { setTimeout(()=> { console.log('你好') fn() }, 1000) } ajax(() => { console.log('执行结束') ajax(()=>{ console.log('执行结束') ajax(()=>{ console.log('执行结束') ajax(()=>{ console.log('执行结束') }) }) }) }) 2.promise解决回调地狱

解决回调地狱问题

1.回调地狱 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但是该函数又接受一个函数 B 作为参数,甚至 B 还接受 C 作为参数使用,就这样层层嵌套,人称之为回调地狱,代码阅读性非常差.比如: var sayhello = function (name, callback) { setTimeout(function () { console.log(nam

async + promise 解决回调地狱

// 解决异步回调地狱的方案: async + promise async function writeFile() { // 打开文件 const fd = await new Promise((resolve, reject) => { // 执行 打开文件 异步操作 fs.open('c.txt', 'w', (err) => { if (!err) { // 将promise对象的状态改成 成功状态 resolve(); } else { // 将promise对象的状态改成 失败状态

基于PROMISE解决回调地狱问题

回调地狱问题: 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但是该函数又接受一个函数 B 作为参数,甚至 B 还接受 C 作为参数使用,就这样层层嵌套,人称之为回调地狱,代码阅读性非常差. 例如:要发送三个异步的请求要求前面一个请求完成之后再依次发送请求. $.ajax{ url:'url1', success:result=>{ $.ajax{ url:'

javascript异步代码的回调地狱以及JQuery.deferred提供的promise解决方式

我们先来看一下编写AJAX编码常常遇到的几个问题: 1.因为AJAX是异步的,全部依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套.ajax等异步操作越多,嵌套层次就会越深.代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol

回调地狱以及用promise怎么解决回调地狱

哈哈哈,我又又又回来了,不好意思,最近枸杞喝的比较到位,精力比较旺盛. 现在我们来聊一聊啥是回调地狱,注意是回调地狱啊   不是RB人民最爱拍的那啥地狱啊,来吧,上车吧少年,这是去幼儿园的车 都让开,我要上高清无码大图了啊,青少年注意避让 原文地址:https://www.cnblogs.com/suihang/p/9595548.html

回调地狱的解决办法

回调是地狱是容易遇到的坑,解决方案是使用promise 碎碎念 相信各位玩家肯定都写过下面的这样代码: // 同时发送两个请求 let url = 'xxxxx', url1 = 'xx' $.ajax({ url, success(data) { $.ajax({ url: url1, success(data) { console.log('done') } }) } }) 是不是很贴切? 有可能有的新手小伙伴连回调都不知道,这里给大家普及一下 /* ** time - 时间 ** call

javascript异步代码的回调地狱以及JQuery.deferred提供的promise解决方案

我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越深,代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol

NodeJS Multiple Callback解决之使用Q Promises

在上一篇<Javascript Promises模式--相当酷的Callback Hell终结者>我们介绍了Javascript的Promise模式,接着我们就把Javascript Promise用到我们的代码中. JavaScript Promise库 Q 之前试着用过Q,但是没有成功.或者说,在那时候不需要用上Q,所以没有深究.现在抱着学习的态度,重新试了一下,效果还不错. A tool for making and composing asynchronous promises in