异步编程的解决方案:
- 回调函数
- 事件机制
- Promise
- Async function
1/ Promise 1
ES2015, it is a reasoning of data that has not yet been produced. Promise still use the callback(before ES6), so it just make the callback look simpler and more intuitive(just avoid nested callback)
eg:
readFile(file1).then((file1Data)=>{ /* do sth */ })
.then(previousPromiseData)=>{ /* do next thing */})
.catch( /* handle errors */ )
2/ async function && await
ES2017, based on Promise and Generator. Using await pause funtion execution everywhere. Async function also returns a Promise object, which will be parsed when the async funtion returned
eg:
import Api from './api/api.js'
export default async function loadUserInfo(params) {
let userInfo = await new Promise((resolve) => {
Api.loadUserInfo((data) => {
resolve(data);
});
});
return userInfo;
}
import { apiUrls } from './Urls.js';
// user information
static loadUserInfo(success, error) {
let apiUrl = apiUrls.loadUserInfo;
doRequest(apiUrl).then(success, errorHandler(apiUrl, error));
//success: (data)=>{ resolve(data) }; === function success(data) {}
}
3/ Promise 2
Promise 简单来说是一个容器,里面保存着某个未来才会结束的事件。而从这个容器我们可以获取那个未来才会结束的异步操作的结果。
Promise(function(){}){},Promise 构造函数,接收一个函数作为参数。该函数的两个参数分别是 resolve 和 reject 。它们也是函数,由 JavaScript 引擎提供,不用自己部署。
- resolve 函数
将 Promise 对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
- reject 函数
将 Promise 对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去
Promise.then(),用来指定 resolved 状态和 rejected 状态的回调函数。其接受两个参数,第一个是必须提供的回调函数,是状态变为 resolved 时调用;第二个是可选的回调函数,是状态变为 rejected 时调用。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
注意,
Promise 对象的特点之一是不受外界影响:其代表一个异步操作,只有其结果可以决定当前处于哪一种状态,任何其他操作都不能改变,这也是 Promise 这个名字的由来,就是“承诺”,表示只有异步操作的结果才能改变状态,其他手段无法改变。
Promise 对象的另一个特点是一旦状态发生改变,就不会再变:当状态根据异步返回的结果发生变化,pending->resolved 或 pending->rejected,就会一直保持这个结果,所以如果再对 Promise 对象添加回调函数,会立即返回旧的结果。这与事件(Event)是完全不同的,事件是如果错过了它,再去监听,是得不到结果的。
Promise 有什么缺点:
- 无法中途取消,一旦创建它就会立即执行
- 如果不设置回调函数,外部无法获取到其内部抛出的错误
- 当初与pending状态时,无法得知准确状态