js中异步编程的四种方法
http://www.ruanyifeng.com/blog/2012/12/asynchronous_javascript.html
对于异步操作,如果想让它控制台输出顺序为2、1、3,写成这样无论顺序是怎么样的,结果都是1、2、3
setTimeout(() => {
console.log(2)
}, 2000);
setTimeout(() => {
console.log(1)
}, 1000);
setTimeout(() => {
console.log(3)
}, 3000);如果想实现2、1、3的效果可以在每个定时器内嵌套另外的定时器,结果是2、1、3,但是在异步操作很多的时候会显得难以阅读,难以理解和修改,形成了callbackHell回调地狱(>>>>>)
setTimeout(() => {
console.log(2)
setTimeout(() => {
console.log(1)
setTimeout(() => {
console.log(3)
}, 3000);
}, 1000);
}, 2000); function f1(){
return new Promise((res,rej)=>{
setTimeout(() => {
console.log(2)
res()
}, 2000);
})
}
function f2(){
return new Promise((res,rej)=>{
setTimeout(() => {
console.log(1)
res()
}, 1000);
})
}
function f3(){
return new Promise((res,rej)=>{
setTimeout(() => {
console.log(3)
res()
}, 3000);
})
} f1().then(()=>{
return f2()
}).then(()=>{
return f3()
}).then(()=>{
console.log('end')
})
//用promise.then处理异步操作,这样避免了回调地狱
// 2/1/3/end 2秒输出2然后1秒输出1最后三秒输出3和end async function fn() {
await f1()
await f2()
await f3()
console.log('end')
}
fn()
// 可以使用async,await来简化异步操作,不需要再和上面一样使用promise.then来执行异步操作,
// 定义一个异步函数,使用await跟一个异步操作,await表示在这里等待异步操作返回结果,再继续执行。
// 输出结果和上面一样 2、1、3、end 2s输出一个2,再隔1s输出一个1,再隔3s输出一个3,接着输出endasync/await是什么?
我们创建了 promise 但不能同步等待它执行完成。我们只能通过 then 传一个回调函数这样很容易再次陷入 promise 的回调地狱。实际上,async/await 在底层转换成了 promise 和 then 回调函数。也就是说,这是 promise 的语法糖。每次我们使用 await, 解释器都创建一个 promise 对象,然后把剩下的 async 函数中的操作放到 then 回调函数中。async/await 的实现,离不开 Promise。从字面意思来理解,async 是“异步”的简写,而 await 是 async wait 的简写可以认为是等待异步方法执行完成。
async/await用来干什么?
用来优化 promise 的回调问题,被称作是异步的终极解决方案。
async/await内部做了什么?
async 函数会返回一个 Promise 对象,如果在函数中 return 一个直接量(普通变量),async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。如果你返回了promise那就以你返回的promise为准。
await 是在等待,等待运行的结果也就是返回值。await后面通常是一个异步操作(promise),但是这不代表 await 后面只能跟异步操作 await 后面实际是可以接普通函数调用或者直接量的。await的等待机制?
如果 await 后面跟的不是一个 Promise,那 await 后面表达式的运算结果就是它等到的东西;如果 await 后面跟的是一个 Promise 对象,await 它会“阻塞”后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值作为 await 表达式的运算结果。但是此“阻塞”非彼“阻塞”这就是 await 必须用在 async 函数中的原因。async 函数调用不会造成“阻塞”,它内部所有的“阻塞”都被封装在一个 Promise 对象中异步执行。(这里的阻塞理解成异步等待更合理)
async/await在使用过程中有什么规定?
每个 async 方法都返回一个 promise 对象。await 只能出现在 async 函数中。
async/await 在什么场景使用?
单一的 Promise 链并不能发现 async/await 的优势,但是如果需要处理由多个 Promise 组成的 then 链的时候,优势就能体现出来了(Promise 通过 then 链来解决多层回调的问题,现在又用 async/await 来进一步优化它)。
链接:https://www.jianshu.com/p/8dccfa90ba59
async function async1() {
console.log('2')
const data = await async2()
console.log(data)
console.log('8')
}
async function async2() {
return new Promise(function (resolve) {
console.log('3')
resolve('await的结果')
}).then(function (data) {
console.log('6')
return data
})
}
console.log('1')
setTimeout(function () {
console.log('9')
}, 0)
async1()
new Promise(function (resolve) {
console.log('4')
resolve()
}).then(function () {
console.log('7')
})
console.log('5')
1-2-3-4-5-6-7-async2返回的结果-8-9Promise如何实现异步调用

京公网安备 11010502036488号