function successCallback(result) {
console.log("It succeeded with " + result);
}
function failureCallback(error) {
console.log("It failed with " + error);
}
doSomething(successCallback, failureCallback);
複製代碼
promise替代了下面這種舊式的函數,這種舊式函數須要兩個回調函數,並最終調用處理成功事件或者處理失敗事件的回調函數javascript
const promise = doSomething();
promise.then(successCallback, failureCallback);
// 固然你能夠簡單一點
doSomeThing().then(successCallback,failureCallback)
複製代碼
doSomething(function(result) {
doSomethingElse(result, function(newResult) {
doThirdThing(newResult, function(finalResult) {
console.log('Got the final result: ' + finalResult);
}, failureCallback);
}, failureCallback);
}, failureCallback);
複製代碼
這就是咱們熟知的回調地獄java
doSomething().then(function(result) {
return doSomethingElse(result);
})
.then(function(newResult) {
return doThirdThing(newResult);
})
.then(function(finalResult) {
console.log('Got the final result: ' + finalResult);
})
.catch(failureCallback);
複製代碼
避免了回調地獄咱們如今這樣處理react
咱們花了些時間瞭解 promise 作鋪墊,下面來了解 async 和await 的使用es6
你還可使用 異步函數表達式 來定義異步函數。promise
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
// expected output: "resolved"
}
asyncCall();
複製代碼
async
函數時,會返回一個 Promise
對象。當這個 async
函數返回一個值時,Promise
的 resolve
方法會負責傳遞這個值;當 async
函數拋出異常時,Promise
的 reject
方法也會傳遞這個異常值。async
函數中可能會有 await
表達式,這會使 async
函數暫停執行,等待表達式中的 Promise
解析完成後繼續執行 async
函數並返回解決結果。async/await的用途是簡化使用 promises 異步調用的操做,並對一組 Promises執行某些操做。正如Promises相似於結構化回調,async/await相似於組合生成器和 promises。異步
function getProcessedData(url) {
return downloadData(url) // returns a promise
.catch(e => {
return downloadFallbackData(url) // returns a promise
.then(v => {
return processDataInWorker(v); // returns a promise
});
})
.then(v => {
return processDataInWorker(v); // returns a promise
});
}
複製代碼
async function getProcessedData(url) {
let v;
try {
v = await downloadData(url);
} catch (e) {
v = await downloadFallbackData(url);
}
return processDataInWorker(v);
}
複製代碼
注意,在上述示例中,return 語句中沒有 await 操做符,由於 async function 的返回值將隱式傳遞給 Promise.resolve。async
const signup = async () => {
try {
const resp = await signUp(parmas);
doSometing(resp);
} catch (error) {
alert(error);
}
}
};
複製代碼
let sayHi = async functionsayHi(){
throw new Error('出錯了');
}
sayHi().then(result=> {
console.log(result);
}).catch(err=> {
console.log(err.message); //出錯了
});
複製代碼
咱們的async函數中能夠包含多個異步操做,其異常和Promise鏈有相同之處,若是有一個Promise被reject()那麼後面的將不會再進行。函數