认识回调函数
回调函数一般写成callback,作为参数放在函数中,可以在某时刻使用回调函数。约定:回调函数的第一个参数是error,第二个参数及以后是用于成功的参数。
但是不好用,所以有了promise。
promise
promise这样的对象的constructor语法为:
let 对象名=new Promise(
function(resolve,reject){
//在这儿写逻辑代码
}
)
resolve和reject是js提供的回调函数。
resolve(value)—— 如果任务成功完成并带有结果value。reject(error)—— 如果出现了 error,error即为 error 对象。
promise对象的属性
state初始态:"pending"
resolve -> "fulfilled"
reject ->"rejected"。
result最初是undefined
然后在 resolve(value) 被调用时变为 value
或者在 reject(error) 被调用时变为 error。
使用promise对象
promise对象会异步搞完,我想用的时候就用then,catch,finally
- then 语法:
promise.then(
function(result){//.then的第一个参数,是一个函数,在这里处理成功的结果,可以只提供这个参数},
function(error){//.then的第二个参数,在这里接受error}
)
比如:
let promise=new Promise(function(resolve,reject){
setTimeout(()=>resolve("done"),1000);
});
promise.then(
result=>alert(result),//运行这个
error=>alert(error))//不运行这个
- catch 当只想处理reject时,可以.then(null,error方法),也可以直接.catch(error方法)
let promise=new Promise(function(resolve,reject){
setTimeout(()=>reject(new Error("失败了老铁")),1000);
});
promise.catch(
alert;//1秒后显示 失败了老铁
)
- finally .finally()没有参数,不管promise成功与否,执行一下finally的函数,然后继续传下去
new Promise((resolve, reject) => { setTimeout(() => resolve("result"), 2000) }) .finally(() => alert("Promise ready")) .then(result => alert(result)); // <-- .then 对结果进行处理
promise的静态方法
Promise.all
语法:
let promise = Promise.all(iterable);
Promise.all 接受一个可迭代对象(通常是一个数组项为 promise 的数组),并返回一个新的 promise。
当所有给定的 promise 都 resolve 时,新的 promise 才会 resolve,并且其结果数组将成为新 promise 的结果。
如果其中一个 promise 被 reject,Promise.all 就会立即被 reject,完全忽略列表中其他的 promise。它们的结果也被忽略。
Promise.race
与 Promise.all 类似,但只等待第一个 settled 的 promise 并获取其结果(或 error)
语法:
let promise = Promise.race(iterable);
例如:
Promise.race([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Whoops!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1
Promise.any
与 Promise.race 类似,区别在于 Promise.any 只等待第一个 fulfilled 的 promise,并将这个 fulfilled 的 promise 返回。如果给出的 promise 都 rejected,那么则返回 rejected 的 promise 和 AggregateError 错误类型的 error 实例—— 一个特殊的 error 对象,在其 errors 属性中存储着所有 promise error。
语法:
let promise = Promise.any(iterable);
Promise.allSettled
如果任意的 promise reject,则 Promise.all 整个将会 reject.这样可以确保所有结果都成功。
Async和await
async使修饰的函数总是返回一个promise。
async function f(){
return 1;
}
f().then(alert);//1
await 只在 async 函数内工作,让 JavaScript 引擎等待直到 promise 完成(settle)并返回结果
let 变量=await 一个promise对象
例如:
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 1000) });
let result = await promise; // 等待,直到 promise resolve
alert(result); // "done!" }
f();
注意:
await 实际上会暂停函数的执行,直到 promise 状态变为 settled,然后以 promise 的结果继续执行。这个行为不会耗费任何 CPU 资源,因为 JavaScript 引擎可以同时处理其他任务:执行其他脚本,处理事件等。
相比于 promise.then,它只是获取 promise 的结果的一个更优雅的语法。并且也更易于读写。
如果一个 promise 正常 resolve,await promise 返回的就是其结果。但是如果 promise 被 reject,它将 throw 这个 error,就像在这一行有一个 throw 语句那样。
当我们使用 async/await 时,几乎就不会用到 .then 了,因为 await 为我们处理了等待。并且我们使用常规的 try..catch 而不是 .catch。这通常(但不总是)更加方便。
但是当我们在代码的顶层时,也就是在所有 async 函数之外,我们在语法上就不能使用 await 了,所以这时候通常的做法是添加 .then/catch 来处理最终的结果(result)或掉出来的(falling-through)error,例如像上面那个例子中的 (*) 行那样。