новая приправа, новый вкус
Эта статья основана на вопросах собеседования и не рекомендуется применять в проекте. Если есть какая-либо ошибка, добро пожаловать
основная концепция
Promise
Прокси, который содержит значение, которое можно использовать в будущем, сам выполняется строго асинхронно.
function resolveUnderThreeSeconds(delay) {
return new Promise(function(resolve, reject) {
setTimeout(() => resolve('success'), delay)
setTimeout(() => reject('fail'), 3000)
})
}
resolveUnderThreeSeconds(2000)
.then(res => {
console.log('res', res)
})
.catch(err => {
console.log('err', err)
})
При написании асинхронного кода одна из двух задач может зависеть от результатов другой, поэтому две задачи должны выполняться последовательно.
Promise.all()
метод принимаетPromise
массив, все в массивеPromise
После успешного выполнения вернуть каждый элемент в соответствии с поступающим заказомPromise
данные результата, один из которых отклонен, он будет приостановлен и вернет сообщение об ошибке
const p1 = Promise.reject('failed')
const p2 = Promise.resolve('success')
const p3 = Promise.resolve('success')
const p = Promise.all([p1, p2, p3]).catch(err => console.log(err))
Async/Await
Async Functions Комбинируйте реализацию на основе обещания с синхронизацией стиля генератора
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();
выполнить
Функциональный анализ
Жизненноважный:Promise.all()
входящийpromise
массив, все в массивеPromise
После успешного выполнения вернуть каждый элемент в соответствии с поступающим заказомPromise
данные результата, один из которых отклоняется, он приостанавливается и возвращается сообщение об ошибке
запись массиваasync
функция, циклasync/await
Выполните введенную функцию массива, затем сформируйте результат функции в массив и, наконец, верните массив
try/catch
доступныйasync
внутри функции любойawait
ошибка, может удовлетворить其中一个被拒绝,即会暂停,并返回错误信息
функция
async function asyncAlls(jobs) {
try {
// 循环执行
let results = jobs.map(async job => await job)
let res = []
// 组合数组
for (const result of results) {
res.push(await result)
}
return res
} catch (error) {
throw new Error(error)
}
}
Пример дисплея
function doJob(x, sec) {
if (!x) {
throw new Error('test error')
}
return new Promise(resolve => {
console.log('Start: ' + x)
setTimeout(() => {
console.log('End: ' + x)
resolve(x)
}, sec * 100)
})
}
async function asyncAlls(jobs) {
try {
let results = jobs.map(async job => await job)
let res = []
for (const result of results) {
res.push(await result)
}
return res
} catch (error) {
throw new Error(error)
}
}
(async function() {
try {
const all1 = await asyncAlls([doJob(1, 1), doJob(2, 1), doJob(0, 1), doJob(4, 1)])
console.log('all1', all1)
} catch (error) {
console.log('0', error)
}
try {
const all2 = await asyncAlls([doJob(5, 1), doJob(6, 1), doJob(7, 1), doJob(8, 1)])
console.log('all2', all2)
} catch (error) {
console.log('1', error)
}
})()
Суммировать
Идея этой статьи возникла из вопроса интервью. Из любопытства потребовалось некоторое время, чтобы реализовать это. В этот период было много вещей, которые я не понимал, и я также советовался со многими друзьями. Спасибо для развеивания ваших сомнений.
Примеры в этой статье предназначены только для обучения, а приложения и практические проекты не рекомендуются.
Спасибо за прочтение