ES2017 async function

异步编程的解决方案:

  • 回调函数
  • 事件机制
  • 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 引擎提供,不用自己部署。

  1. resolve 函数

将 Promise 对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去

  1. 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 有什么缺点:

  1. 无法中途取消,一旦创建它就会立即执行
  2. 如果不设置回调函数,外部无法获取到其内部抛出的错误
  3. 当初与pending状态时,无法得知准确状态

猜你喜欢

转载自blog.csdn.net/hoanFir/article/details/87623126
今日推荐