什么是回调函数,它与常规函数有何不同?
与回调相比,promise 如何提高代码可读性并管理异步操作?
promise 的主要状态是什么,它们如何在这些状态之间转换?
如何使用 promise 处理错误,这与使用回调的错误处理相比如何?
promise.all 和 promise.race 有什么区别,什么时候会使用它们?
async/await 语法如何简化 promises 的使用,以及使用 wait 的规则是什么?
promise 相对于回调的好处
回调地狱的例子:
fetchdata(function(response1) { fetchmoredata(response1, function(response2) { fetchevenmoredata(response2, function(response3) { console.log(response3); }); }); });
fetchdata() .then(response1 => fetchmoredata(response1)) .then(response2 => fetchevenmoredata(response2)) .then(response3 => console.log(response3)) .catch(error => console.error(error));
使用回调处理错误:
function fetchdata(callback) { settimeout(() => { if (/* error condition */) { callback(new error('an error occurred'), null); } else { callback(null, 'data'); } }, 1000); } fetchdata((error, data) => { if (error) { console.error(error); } else { console.log(data); } });
function fetchdata() { return new promise((resolve, reject) => { settimeout(() => { if (/* error condition */) { reject(new error('an error occurred')); } else { resolve('data'); } }, 1000); }); } fetchdata() .then(data => console.log(data)) .catch(error => console.error(error));
例子:
const promise1 = promise.resolve(3); const promise2 = 42; const promise3 = new promise((resolve, reject) => { settimeout(resolve, 100, 'foo'); }); promise.all([promise1, promise2, promise3]).then(values => { console.log(values); // [3, 42, "foo"] });
例子:
const promise1 = new promise((resolve, reject) => { settimeout(resolve, 500, 'one'); }); const promise2 = new promise((resolve, reject) => { settimeout(resolve, 100, 'two'); }); promise.race([promise1, promise2]).then(value => { console.log(value); // "two" });
例子:
async function fetchData() { return 'data'; } async function processData() { try { const data = await fetchData(); console.log(data); } catch (error) { console.error(error); } } processData();