异步代码的处理方案
需求:异步处理 直接看例子
url
url=url+str1
url=url+str2
1:第一种方案多次回调 回调地狱
1 function requestData(url) { 2 //异步请求代码会被放在excutor中 3 return new Promise((resolve, reject) => { 4 setTimeout(() => { 5 resolve(url) 6 }, 1000) 7 8 }) 9 } 10 //1:第一种方案多次回调 回调地狱 11 requestData("tyy").then(res => { 12 requestData(res + " is").then(res => { 13 requestData(res + " happy").then(res => { 14 console.log(res); 15 }) 16 }) 17 })
2:第二种方案 :Promise中then的返回值来解决 链式调用
1 function requestData(url) { 2 //异步请求代码会被放在excutor中 3 return new Promise((resolve, reject) => { 4 setTimeout(() => { 5 resolve(url) 6 }, 1000) 7 8 }) 9 } 10 requestData("tsf").then(res => { 11 return requestData(res + " also") 12 }).then(res => { 13 return requestData(res + " is") 14 }).then(res => { 15 return requestData(res + " happy") 16 }).then(res => { 17 console.log(res); 18 })
3:Promise+gnerator实现--yiled后面的值会作为value
1 function requestData(url) { 2 //异步请求代码会被放在excutor中 3 return new Promise((resolve, reject) => { 4 setTimeout(() => { 5 resolve(url) 6 }, 1000) 7 8 }) 9 } 10 function* getData() { 11 const res1 = yield requestData("zjj") 12 const res2 = yield requestData(res1 + " is") 13 const res3 = yield requestData(res2 + " happy") 14 const res4 = yield requestData(res3 + " too") 15 console.log(res4); 16 } 17 // //手动执行生成器函数 18 // const generator = getData() 19 // generator.next().value.then(res => { 20 // generator.next(res).value.then(res => { 21 // generator.next(res).value.then(res => { 22 // generator.next(res) 23 // }) 24 // }) 25 // }) 26 //自动化 27 function exeGnerator(genFn) { 28 const generator = genFn() 29 function exec(res) { 30 const result = generator.next(res) 31 if (result.done) return result.value 32 result.value.then(res => { 33 exec(res) 34 }) 35 36 } 37 exec() 38 }
4:第三方包co自动执行
1 requestData("tyy").then(res => { 2 requestData(res + " is").then(res => { 3 requestData(res + " happy").then(res => { 4 console.log(res); 5 }) 6 }) 7 }) 8 function* getData() { 9 const res1 = yield requestData("zjj") 10 const res2 = yield requestData(res1 + " is") 11 const res3 = yield requestData(res2 + " happy") 12 const res4 = yield requestData(res3 + " too") 13 console.log(res4); 14 } 15 const co = require('co') 16 co(getData)
5:async/await
1 function requestData(url) { 2 //异步请求代码会被放在excutor中 3 return new Promise((resolve, reject) => { 4 setTimeout(() => { 5 resolve(url) 6 }, 1000) 7 8 }) 9 } 10 async function getData() { 11 const res1 = await requestData("zjj") 12 const res2 = await requestData(res1 + " is") 13 const res3 = await requestData(res2 + " happy") 14 const res4 = await requestData(res3 + " too") 15 console.log(res4); 16 } 17 getData()

浙公网安备 33010602011771号