HTTP请求方式
符合规则的URL地址
异步编程的一种解决方案。从语法上讲,Promise是一个对象,从它可以获取异步操作的消息。
好处:
var p = new Promise(function(resolve, reject) {
// 成功时调用 resolve()
// 失败时调用 reject()
});
p.then(function(ret) {
// 从resolve得到正常结果
}, function(ret) {
// 从reject得到错误信息
});
<script>
function queryData(url) {
var p = new Promise(function(resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState != 4) return;
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理正常的情况
resolve(xhr.responseText);
} else {
// 处理异常的情况
reject('error')
}
};
xhr.open('get', url);
xhr.send(null);
});
return p;
}
queryData('http://localhost:3000/data')
.then(function(data) {
console.log(data);
}, function(info) {
console.log(info);
});
</script>
queryData()
.then(function(data) {
return queryData();
})
.then(function(data) {
return queryData();
})
.then(function(data) {
return queryData();
});
// 发送多个Ajax请求,并保证顺序
queryData('http://localhost:3000/data')
.then(function(data) {
console.log(data);
return queryData('http://localhost:3000/data1');
})
.then(function(data) {
console.log(data);
return queryData('http://localhost:3000/data2');
})
.then(function(data) {
console.log(data);
})
queryData('http://localhost:3000/data')
.then(function(data) {
return queryData('http://localhost:3000/data1');
})
.then(function(data) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(123);
}, 1000)
});
})
.then(function(data) {
console.log(data); //123
})
queryData('http://localhost:3000/data')
.then(function(data) {
return queryData('http://localhost:3000/data1');
})
.then(function(data) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(123);
}, 1000)
});
})
.then(function(data) {
return 'hello';
})
.then(function(data) {
console.log(data); // hello
})
queryData()
.then(function(data) {
console.log(data);
})
.catch(function(data) {
console.log(data);
})
.finally(function(data) {
console.log('finished');
})
例子:
<script>
// console.dir(Promise)
function foo() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
// resolve(123);
reject('error')
}, 100)
})
}
// foo()
// .then(function(data) {
// console.log(data);
// })
// .catch(function(data) {
// console.log(data);
// })
// .finally(function() {
// console.log('finished');
// });
// 与上面写法等效,但是用catch语义比较清晰
foo()
.then(function(data) {
console.log(data);
}, function(data) {
console.log(data);
})
.finally(function() {
console.log('finished');
});
</script>
Promise.all([p1, p2, p3]).then((result) => {
console.log(result)
})
Promise.race([p1, p2, p3]).then((result) => {
console.log(result)
})
例子:
app.get('/a1', (req, res) => {
setTimeout(function() {
res.send('Hello')
}, 1000)
});
app.get('/a2', (req, res) => {
setTimeout(function() {
res.send('World')
}, 2000)
});
app.get('/a3', (req, res) => {
setTimeout(function() {
res.send('Hello World!')
}, 3000)
});
<script>
// console.dir(Promise)
function queryData(url) {
return new Promise(function(resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState != 4) return;
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理正常的情况
resolve(xhr.responseText);
} else {
// 处理异常情况
reject('服务器错误');
}
};
xhr.open('get', url);
xhr.send(null);
});
}
var p1 = queryData('http://localhost:3000/a1');
var p2 = queryData('http://localhost:3000/a2');
var p3 = queryData('http://localhost:3000/a3');
// 拿到三个结果 ["Hello", "World", "Hello World!"]
Promise.all([p1, p2, p3]).then(function(result) {
console.log(result);
})
// 只拿到第一个结果 hello
Promise.race([p1, p2, p3]).then(function(result) {
console.log(result);
})
</script>
fetch(url).then(fn2)
.then(fn3)
...
.then(fn)
fetch('/abc').then(data => {
// text() 方法属于fetchAPI的一部分,他返回一个Promise实例对象,用于获取后台返回数据
return data.text();
}).then(ret => {
// 注意这里得到的才是最终数据
console.log(ret);
});
fetch('/abc'), {
methods: 'get'
}).then(data => {
return data.text();
}).then(ret => {
// 注意这里得到的才是最终数据
console.log(ret);
});
第一种:
fetch('/abc?id=123').then(data => {
return data.text();
}).then(ret => {
// 注意这里得到的才是最终数据
console.log(ret);
});
第二种:
fetch('/abc/123', {
method: 'get'
}).then(data => {
return data.text();
}).then(ret => {
// 注意这里得到的才是最终数据
console.log(ret);
});
例子:
app.get('/books', (req, res) => {
res.send('传统的URL传递参数' + req.query.id)
});
app.get('/books/:id', (req, res) => {
res.send('Restful形式的URL传递参数' + req.params.id)
});
<script>
// fetch('http://localhost:3000/books?id=123', {
// method: 'get'
// })
// .then(function(data) {
// return data.text();
// }).then(function(data) {
// console.log(data);
// });
fetch('http://localhost:3000/books/456', {
method: 'get'
})
.then(function(data) {
return data.text();
}).then(function(data) {
console.log(data);
});
</script>
fetch('/abc/123', {
method: 'delete'
}).then(data => {
return data.text();
}).then(ret => {
// 注意这里得到的才是最终数据
console.log(ret);
});
方法一:
fetch('/books', {
method: 'post',
body: 'uname=lisi&pwd=123',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}
}).then(data => {
return data.text();
}).then(ret => {
console.log(ret);
});
方法二:
fetch('/books', {
method: 'post',
body: JSON.stringify({
uname: 'lisi',
age: 12
}),
headers: {
'Content-Type': 'application/json',
}
}).then(data => {
return data.text();
}).then(ret => {
console.log(ret);
});
fetch('/books/123', {
method: 'put',
body: JSON.stringify({
uname: 'lisi',
age: 12
}),
headers: {
'Content-Type': 'application/json',
}
}).then(data => {
return data.text();
}).then(ret => {
console.log(ret);
});
fetch('/abc' then(data => {
// return data.text();
return data.json();
}).then(ret => {
console.log(ret);
});
axios是一个基于Promise用于浏览器和node.js的HTTP客户端
特性:
axios.get('/adata')
.then(ret => {
// data属性名称是固定的,用于获取后台响应的数据
console.log(ret.data)
})
axios.get('/adata?id=123')
.then(ret => {
console.log(ret.data)
})
axios.get('/adata/123')
.then(ret => {
console.log(ret.data)
})
axios.get('/adata', {
params: {
id: 123
}
})
.then(ret => {
console.log(ret.data);
})
axios.delete('/adata?id=123')
.then(ret => {
console.log(ret.data)
})
axios.delete('/adata/123')
.then(ret => {
console.log(ret.data)
})
axios.delete('/adata', {
params: {
id: 123
}
})
.then(ret => {
console.log(ret.data);
})
axios.post('/adata', {
uname: 'tom',
pwd; 123
}).then(ret => {
console.log(ret.data)
})
const params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('api/test', params).then(ret => {
consloe.log(ret.data)
})
axios.put('/adata/123', {
uname: 'tom',
pwd; 123
}).then(ret => {
console.log(ret.data)
})
axios.post('/axios-json').then(ret => {
console.log(ret)
})
在请求发出之前设置一些信息
// 添加一个请求拦截器
axios.interceptors.request.use(function(config) {
// 在请求发出前进行一些信息设置
return config;
}, function(err) {
// 处理响应的错误信息
});
在获取数据之前对数据做一些加工处理
// 添加一个响应拦截器
axios.interceptors.response.use(function(res) {
// 在这里对返回的数据进行处理
return res;
}, function(err) {
// 处理响应的错误信息
});
async function queryData(id) {
const ret = await axios.get('/data');
return ret;
}
queryData.then(ret => {
console.log(ret)
})
多个异步请求的场景
async function queryData(id) {
const info = await.axios.get('async1');
const ret = await.axios.get('async2?info='+info.data');
return ret;
}
queryData.then(ret => {
console.log(ret)
})