地狱

从 回调地狱 到神奇的 promise

≯℡__Kan透↙ 提交于 2020-03-17 12:06:17
1.为什么会产生回调地狱 当我们需要在异步的末尾做一些事情的时候,我们就会用到回调函数。当回调函数嵌套过多的时候,我们的代码就没有可阅读性和可维护性,这种情况我们就称之为 回调地狱 。 2.promise 这个promise是es6的语法,是异步编程的一种解决方法,比传统的解决方法更强加,更合理。 3.promis的语法 let p1 = new Promise(function (resolve, reject) {}) p1.then(function () { // 这个函数就是当你的 Promise 里面书写 resolve() 的时候,就会调用了 console.log(123) }) 这里的2个参数 : 如果成功了,就是 resolve,成功之后执行函数p1.then() 如果失败了,就是 reject,失败之后执行的函数p1.catch() 4.promise的高级应用 当你在这个 function 里面 return 一个新的 promise 对象的时候 可以继续.then() ,以ajax的请求计算sum为例: new Promise(function (resolve) { ajax({ url: './ajax1.php', data: { a: 100, b: 200 }, dataType: 'json', success: function

NodeJS回调地狱

风流意气都作罢 提交于 2020-02-18 11:50:32
NodeJS回调地狱 一.为什么要写这篇文章    前段时间和朋友做一个小程序,在很多地方如果用户没有登录,因为小程序的升级,不能直接通过现有的API来获取用户的信息,必须得通过点击按钮的方式,首先获取用户的信息后,进入回调方法,通过switchTab到达登录页面,登录成功后在回到之前的页面。整个逻辑非常的简单,代码实现起来也简单,但是在嵌套上真心恶心到我了。这让我不禁的想到了NodeJS,至于为什么想到NodeJS,你品,你用心品。这个问题,在行业内,大家都把他叫做“回调地狱”。为什么会产生回调地狱呢?因为NodeJS推崇异步编程,那么恰恰是异步编程就容易导致“回调地狱”。 二.案例演示 现假设这样一个场景,一个程序员去面试,需要经过三轮面试,第二、三轮面试必须要拿到上轮面试通过后的结果才能进行下场面试,而每场面试需要等待一段时间后才给回复,下面通过代码来模拟一下这个场景: // 面试 function interview(callback) { setTimeout(() => { //模拟出当前面试, 有60%通过的概率 if(Math.random() <= 0.6) { callback(null, 'success') }else { callback(new Error('error')) } }, 100) } // 第一轮面试 interview((e) => {

基于Nodejs下解决回调地狱的Promise

非 Y 不嫁゛ 提交于 2019-12-25 01:09:53
回调地狱的产生 无法保证顺序的代码: var fs = require ( 'fs' ) fs . readFile ( './data/a.txt' , 'utf8' , function ( err , data ) { if ( err ) { // return console.log('读取失败') // 抛出异常 // 1. 阻止程序的执行 // 2. 把错误消息打印到控制台 throw err } console . log ( data ) } ) fs . readFile ( './data/b.txt' , 'utf8' , function ( err , data ) { if ( err ) { throw err } console . log ( data ) } ) fs . readFile ( './data/c.txt' , 'utf8' , function ( err , data ) { if ( err ) { throw err } console . log ( data ) } ) 由于是readFile是异步的,无法保证读取文件内容的输出是一步一步来的 如何保证顺序呢?通过回调的方式保证其顺序 var fs = require ( 'fs' ) fs . readFile ( './data/a.txt' , 'utf8' ,

文昌帝君戒淫文

匿名 (未验证) 提交于 2019-12-03 00:39:02
  文帝垂训曰。吾奉金阙(què)至尊之命。于每月寅卯日。按行酆(fēng)都地狱。考定天下有罪人民事实。见夫黑籍如山。皆是世人一生孽案。其间作恶多端。惟淫恶之报。天律最严。人奸妻女。玷(diàn)人闺(guī)门。在地狱中。受苦五百劫。方得脱生。为骡为马。又五百劫。乃复人身。为娼为妓。设谋造计。奸宿寡妇尼僧。败人操履。在地狱中。受苦八百劫。方得脱生。为羊为豕(shǐ)。供人宰杀。又八百劫。乃复人身。为瞽(gǔ)为哑。以卑乱尊。以长乱幼。败坏纲常。在地狱中。受苦一千五百劫。方得脱生。为蛇为鼠。又一千五百劫。方得人身。或在母胎中死。或在孩抱中亡。毕竟不享天年。 原文:https://www.cnblogs.com/pythonproject/p/9255400.html

异步函数-解决回调地狱

穿精又带淫゛_ 提交于 2019-12-02 12:46:37
回调函数多层嵌套,不易于代码的扩展并且很难维护 const fs = require ( 'fs' ) ; fs . readFile ( './1.txt' , 'utf8' , ( err , result1 ) => { console . log ( result1 ) fs . readFile ( './2.txt' , 'utf8' , ( err , result2 ) => { console . log ( result2 ) fs . readFile ( './3.txt' , 'utf8' , ( err , result3 ) => { console . log ( result3 ) } ) } ) } ) ; 使用异步函数能有效的解决回调地狱的问题(ES7) const fs = require ( 'fs' ) //改造现有异步函数api 让其返回promise对象 从而支持异步函数语法 //promisify是util模块里的一个方法,可以改造现有异步函数使其能返回promise对象的函数 const promisify = require ( 'util' ) . promisify // 调用promisify方法改造现有异步API 让其返回promise对象 const readFile = promisify ( fs .

基于PROMISE解决回调地狱问题

╄→尐↘猪︶ㄣ 提交于 2019-11-27 21:33:42
   回调地狱问题:     在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱。比如说你要把一个函数 A 作为回调函数,但是该函数又接受一个函数 B 作为参数,甚至 B 还接受 C 作为参数使用,就这样层层嵌套,人称之为回调地狱,代码阅读性非常差。     例如:要发送三个异步的请求要求前面一个请求完成之后再依次发送请求。 $.ajax{ url:'url1', success:result=>{ $.ajax{ url:'url2', success:result=>{ $.ajax{ url:'url3', success:result=>{ } }; } }; } };//这就是一个栗子     基于PROMISE解决     Promise:ES6新增的内置类,是为了管理异步操作的。 //封装成多个方法 let queryA = function(){ return new Promise(resolve=>{ $.ajax({ url:'url1', success:resolve, }); }); } let queryB = function(){ return new Promise(resolve=>{ $.ajax({ url:'url2', success

Promise如何解决回调地狱

纵然是瞬间 提交于 2019-11-26 02:26:28
为什么要有promise:解决(回调地狱)的问题 ### 回调地狱: ```js //跟以前的if条件地狱很像 // if(){ // if(){ // if(){ // } // } //} $.get("/getUser",function(res){   $.get("/getUserDetail",function(){      $.get("/getCart",function(){        $.get("/getBooks",function(){ //...        })      })    }) }) //node开发:读取文件;开个服务器、接收一个请求、请求路径、访问数据库 ``` ### Promise函数基本用法 ```js var promise=new Promise((resolve,reject)=>{   //b 把需要执行的异步操作放在这里   $.get("/getUser",res=>{     //获取数据的异步操作已经执行完毕了,等待下一步的执行,通过执行resolve函数,告诉外界你可以执行下一步操作了     //c、     resolve(res) //只是一个标记     //而执行的下一步操作,其实就是写在then的回调函数中的   }) }) //a、 promise.then(res=>{   //d