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()那么后面的将不会再进行。函数