1. 看代码,说输出
new Promise((resolve, reject) => { for(let i = 0; i < 3; i++){ resolve(i); console.log(i); } }).then(data => console.log(data)); // 输出是: // 0 // 1 // 2 // 0
2. async await 怎么处理错误
async await 从语法层面给人一种非常直观的方式,可以让我们避免 callback hell 与 Promise hell.
async function getUserInfo(){ const id = await request.getCurrentUserId(); const info = await request.getUserInfo(id); return info; }
但是,每一步 await 都可能出错,为了捕获这些错误,我们使用 try...catch...
async function getUserInfo(){ try{ const id = await request.getCurrentUserId(); } catch(e){ return cb('an error in getCurrentUserId'); } try{ const info = await request.getUserInfo(id); }catch(e){ return cb('an error in getUserInfo'); } return cb(null, info); }
这样的代码丑陋且不直观,因为 await 返回的是一个 Promise,因此可以使用一个函数包装一个来符合 error first 的原则,从而避免 try...catch...
function to(promise){ return promise.then(data => { return [null, data]; }).then(err => [err]); }
通过这个函数包装一下上面的例子
async function getUserInfo(){ let err, id, info; [err, id] = await to(request.getCurrentUserId()); if(err){ return console.error(err); } [err, info] = await to(request.getCurrentUserInfo()); if(err){ return console.error(err); } return info; }