Table of Contents generated with DocToc
用于发送异步请求,返回 Promise 对象
fetch(request).then(function(response) {
// handle HTTP response
if(response.ok) {
// ....
}else {
// ...
}
}, function(error) {
// handle network error
})
更详细的例子:
// 提交GET请求
fetch(url).then(function(res) {
}, function(error) {
});
// 提交POST请求
// request 请求
fetch(url, {
method: "POST",
body: JSON.stringify(data),
// fetch 的 Headers 接口
headers: {
"Content-Type": "application/json"
},
credentials: "same-origin"
}).then(function(response) {
// response 相应
response.status //=> number 100–599
response.statusText //=> String
response.headers //=> Headers
response.url //=> String
response.text().then(function(responseText) { ... })
}, function(error) {
error.message //=> String
})
- Headers
// 不同的构造方法
// key-value
var content = "Hello World";
var reqHeaders = new Headers();
reqHeaders.append("Content-Type", "text/plain"
reqHeaders.append("Content-Length", content.length.toString());
reqHeaders.append("X-Custom-Header", "ProcessThisImmediately");
// json
reqHeaders = new Headers({
"Content-Type": "text/plain",
"Content-Length": content.length.toString(),
"X-Custom-Header": "ProcessThisImmediately",
});
- request
/** 注:
* request = (url, options)
* url 为请求的路径
* options为详细配置:
**/
- method (String) - HTTP 请求方式, 默认为 "GET"
- body (String, Blob, FormData) - HTTP 请求体
- headers (Object, Headers) - 请求头部, Default: {}
- credentials (String) - 是否允许跨域请求 Authentication credentials mode. Default: "omit". Other data structures need to be encoded before hand as one of these types
- "omit" - don't include authentication credentials (e.g. cookies) in the request
- "same-origin" - 如果一个请求是跨域的,那么返回一个简单的error
- "include" - include credentials in requests to all sites
- response
response 的属性:
status (number) - HTTP状态码,100~599之间
statusText (String) - Status text as reported by the server, e.g. "Unauthorized"
ok (boolean) - 如果返回的HTTP状态码为2XX则为true
headers (Headers)
url (String)
response处理body的方法:
返回一个Promise对象
text() - 将 response text 转为 String
json() - 输出 result of JSON.parse(responseText)
blob() - yields a Blob
arrayBuffer() - yields an ArrayBuffer
formData() - 处理成可以再次被request使用的formData对象
request 和 response 的body 只能被读取一次, 读取之后 bodyUsed 属性被设置为 true, 则不能再次读取
若要多次读取 body, 则应该在读取之前调用 response.clone()
方法, 之后读取clone的body(每个clone只能读取一次)
- 通过fetch获取数据
fetch(url).then((response) => response.json()) // 解析获取到的json
.then((data) => {
// do something
})
.catch((error) => {
// do something
});
- 通过fetch发送数据
fetch(url, {
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({data})
})
.then((response) => response.json())
.then((data) => {
// do something
})
.then((error) => {});
- 作用
在 Promise
对象内部编写异步操作,并通过其自带的 resolve
和 reject
进行异步结果返回的处理。之后在使用这个 Promise
的时候,便可以通过 .then((result) => {}).then((result) => {})...
进行链式调用。 .then()
函数中的 result
参数即异步操作的结果
- status
Promise 对象所拥有的几种状态:
- pending 初始化状态
- fulfilled 成功的状态
- rejected 失败的状态
- example
function example(data) {
console.log(data)
// resolve 和 reject 分别表示异步操作执行成功或失败后的回调函数
var promise = new Promise((resolve, reject) => {
$.ajax({
url: www.example.com?page=1&num=1,
methon: get,
success: (data) => {
resolve(data);
},
error: (error) => {
reject(error);
}
});
});
return promise;
}
- usage
// then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调
// 但这种方法无法捕获resolve回调中产生的异常
example().then(
(result) => {
// 获取 resolve 传输的参数
},
(error) => {
// 获取 reject 传输的参数
}
);
/**
* 或者使用 catch 写法,在 catch 中指定 reject 时的回调
* 当 reject 或者 resolve 失败的时候,会调用 catch
* catch()方法是then(undefined, onRejected)的一个别名
**/
example().then((result) => {
// do something..
}).catch((error) => {
// when fail..
});
Promise.then()
和Promise.catch()
都返回 Promise 对象,因此可以链式调用
如果只想对异常进行处理,可以采用promise.then(undefined, callback);
方法
/**
* Promise 的链式操作
* 可以保证按照顺序依次执行异步操作,并能利用上一步异步操作的结果
**/
example().then((data1) => {
// 获取 resolve 传输的参数
example(data1)
}).then((data2) => {
example(data2);
}).then((data3) => {
console.log(data3);
});
// 输出 data1 data2 data3
- final
Promise中没有.final()
API,但是我们可以手动造一个:
promise(XXX).then((result) => {
// resolve时
}).catch((err) => {
// reject时
}).then(
/*
* 全部处理完以后
* do something..
* 注:如果发生错误则不会catch
*/
)
Promise.all()
接收一个数组作为参数,数组内是多个 Promise 对象。 .then()
会在全部 Promise 执行完毕之后返回一个包含所有异步操作结果的 list
传递给 Promise.all 的promise并不是一个个的顺序执行的,而是同时开始、并行执行的
Promise.all([example(1), example(2), example(3)])
.then((result) => {
console.log(result);
// [data1, data2, data3]
});
Promise.all()
所耗费的时间为最慢的异步操作的时间
如果传入的数组中某项不是一个 promise ,该项会被用Promise.resolve
转换为一个promise
如果传出的参数list中有任意 Promise 失败返回 reject, 那么 .all()
将带着该 Promise 的 reject参数进入 reject 状态,不再理会其他 Promise 的返回结果
Promise.race()
接收一个数组作为参数,数组内是多个 Promise 对象。 .then()
会在执行最快的 Promise 执行完毕之后返回一个包含异步操作结果的 result
在最快的 Promise 执行完毕之后,数组参数中的其他 Promise 会正常继续执行,并通过 .then()
返回结果
如果最快的 Promise 返回 reject,那么.race()
将会返回 reject,不再理会之后的 Promise 操作结果
用同步的方法写异步
const setTimeoutToLog = () => {
setTimeout(() => {
console.log('test async');
}, 1000);
}
const showConsole = async () => {
await setTimeoutToLog();
}
showConsole();
await
会阻塞后面代码的执行,直到异步函数执行完成