Весенний праздник года Крысы состоит всего из трех слов «жай ~ жай ~ жай ~», я думаю о теме JS, с которой я сталкивался раньше, я чувствую, что это довольно интересно, пусть все подумают об этом вместе ~
Во-первых, давайте поговорим о теме (спрос идет, давайте встретимся с ветром~)
/**
* 请写出两种或两种以上实现方法满足: execute 对应的id按顺序打印
* PS: 尝试只修改start函数体
*
* 输出结果参考:
* id 0
* id 1
* id 2
* id 3
* id 4
*/
function start(id) {
execute(id).catch(console.error);
}
// 测试代码 (请勿更改):
for (let i = 0; i < 5; i++) {
start(i);
}
function sleep() {
const duration = Math.floor(Math.random() * 500);
return new Promise(resolve => setTimeout(resolve, duration));
}
function execute(id) {
return sleep().then(() => {
console.log("id", id);
});
}
Увидев эту тему, можно подумать 30 с и подумать, как ее решить.Если интересно, можно сразу скопировать тему в удобный редактор и попробовать написать.Для программистов процесс мышления - это еще очень важно.
Давайте начнем писать ответ ниже ~ Конечно, это всего лишь мое решение проблемы. Если у вас есть лучшие решения, я надеюсь, что вы можете дать мне несколько советов в области комментариев или вы можете отсканировать код и добавить QR-код в конце статьи для связи. в группе WeChat. Вы готовы? Детка~
Следующий ответ изменит только тело функции запуска, в конце концов, наш вопрос требует только изменения тела функции запуска.
ответь один
Это решение может соответствовать требованиям, но каждый раз, когда вызывается функция запуска, таймер будет очищаться, так что функция выполнения будет выполняться только после того, как все вызовы будут отправлены Код не элегантен, и функцию едва ли можно осуществленный.
Обратите внимание, что this.x в теле функции запуска в этом примере можно заменить на start.x Это позволит избежать исключения, вызванного тем, что this не определено в строгом режиме, и избежать загрязнения глобальных переменных в нестрогом режиме.
function start(id) {
if (!this.processList) this.processList = [];
this.processList.push({ id });
clearTimeout(this.t);
this.t = setTimeout(() => {
(async () => {
let target = this.processList.shift();
while (target) {
await execute(target.id);
target = this.processList.shift();
}
})();
}, 0);
}
Как FEer с преследованием, как мы можем просто оставаться в плане один, думая ~~~
Ответить два
После долгих размышлений я, наконец, прошел через две жилы Рена и Ду и написал самую элегантную схему реализации, которую я считаю самой элегантной.Эта схема не требует использования таймера.Идея состоит в цепном вызове промиса, который есть функция then.
function start(id) {
start.promises = !start.promises
? execute(id)
: start.promises.then(() => execute(id));
}
В этот момент решение проблемы подходит к концу, весь процесс решения проблемы по-прежнему болезненный, но завершение решения проблемы вызывает чувство достижения~
Студенты, заинтересованные в обмене передовыми технологиями, могут отсканировать код WeChat и подписаться на официальную учетную запись [Knowledge] или присоединиться к группе WeChat для разработчиков передовых технологий, чтобы облегчить обмен передовыми технологиями.
Эта статья является оригинальной и используется только для личного архива, пожалуйста, не перепечатывайте ее по своему желанию. Если есть необходимость в перепечатке, обязательно возьмите ее с собой при перепечатке.Оригинальная ссылка! Кодить не просто, спасибо за сотрудничество!