1. 程式人生 > >Promise,async,await使用

Promise,async,await使用

1.Promise
對於Promise的理解就是一個物件,只不過是可以非同步執行的一個物件。

Promise 物件是一個返回值的代理,這個返回值在promise物件建立時未必已知。它允許你為非同步操作的成功返回值或失敗資訊指定處理方法。 這使得非同步方法可以像同步方法那樣返回值:非同步方法會返回一個包含了原返回值的 promise 物件來替代原返回值。
 ——MDN

Promise物件有以下三個狀態
1. resolve
2.reject
3.unresolve: 剛建立後的初始化狀態.
一旦狀態從unresolve轉變成 resolve或者reject後,就不會再發生變化,即在 .then 後執行的函式可以肯定地說只會被呼叫一次。

const mypromise = new Promise((resolve, reject) => {
	if(1)
	{
		resolve(“成功返回”);//resolve狀態  可以沒有引數 resolve();
	}
	else 
	{
		reject("失敗返回")//reject狀態
	}
	mypromise.then((msg)=>{
	//resolve狀態的回撥函式
	console.log(msg)//成功返回
	}).catch(err=>{
	//reject狀態的回撥函式
	console.log(err)//失敗返回
	})

2.await 與 async
需要注意的地方:
1.async 函式的工作方式


(1)async 函式總是返回一個 Promise 物件 p 。Promise 物件在 async 函式開始執行時被建立。
函式體執行過程中,可以通過 return 或 throw 終止執行。或者通過 await 暫停執行,在這種情況下,通常會在以後繼續執行。
(2)返回 Promise 物件 p
async用於定義一個非同步函式,該函式返回一個Promise。如果async函式返回的是一個同步的值,這個值將被包裝成一個理解resolve的Promise,等同於return Promise.resolve(value) 。
2.await的使用
(1)await用於一個非同步操作之前,表示要“等待”這個非同步操作的返回值。await也可以用於一個同步的值。可以理解為一個等待協程完成的過程。
(2)await正常後面接一個promise。表示等待這個函式(async)完成。但是也可以接普通函式,普通函式作為一個resolve狀態的promise。(正常情況下,await命令後面是一個 Promise 物件。如果不是,會被轉成一個立即resolve的 Promise 物件。)
(3)await的只能在async函式中使用。

async function f() {
  await Promise.reject('出錯了');
} 
f()
.then(v => console.log(v))
.catch(e => console.log(e))
// 出錯了
//async可以這樣做,因為本質返回一個promise.

另外,可以直接在async函式中直接用try…catch語句。就可以避免then()和catch()的使用。

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            // 模擬出錯了,返回 ‘error’
            reject('error');
        }, time);
    })
};
var start = async function () {
    try {
        console.log('start');
        await sleep(3000); // 這裡得到了一個返回錯誤
        // 所以以下程式碼不會被執行了
        console.log('end');
    } catch (err) {
        console.log(err); // 這裡捕捉到錯誤 `error`
    }
};

以上就是Promise,async,await使用需要注意的地方及簡單使用。深入理解的話可以查詢別的大佬寫的資料。