Я новичок в TypeScript, и у меня есть асинхронная функция, подобная приведенной ниже. Может кто-нибудь объяснить, что он делает и откуда берется resolve? Я надеюсь, что предоставляю достаточно информации для этого.
async function SendMessage<T extends WorkerResponse>(msg: { id: number }): Promise<T>
{
const response = await new Promise<WorkerResponse>(resolve =>
{
waitingMessages.set(msg.id, resolve);
worker.postMessage(msg);
});
return response as T;
}
Когда я навожу указатель мыши на переменные, я получаю следующее:
(parameter) resolve: (value: WorkerResponse | PromiseLike<WorkerResponse>) => void
const waitingMessages: Map<number, (response: WorkerResponse) => void>
resolve
является частью концепции Promise. Подробнее об этом можно прочитать здесьВероятно, автору следует начать с еще более низких основ: developer.mozilla.org/en-US/docs/Glossary/Callback_function
Как видите, он строит новый объект Promise, который принимает в качестве параметров разрешение и отклонение.
В этом случае, как вы можете видеть, он возвращает функцию разрешения, это все равно, что сказать Promise.resolve() с некоторыми значениями внутри него. Но вы разрешаете и возвращаете этот объект
{
waitingMessages.set(msg.id, resolve);
worker.`enter code here`postMessage(msg);
});
Вопрос на самом деле связан не с машинописным текстом, а с концепцией обещания javascript и асинхронным ожиданием.
Resolve исходит из конструктора Promise. Конструктор Promise вызывает функцию, которую вы ему даете (функция-исполнитель), с двумя аргументами. При определении функции-исполнителя мы идиоматически называем параметры для получения этих аргументов resolve и reject:
resolve
— Разрешает обещание (которое может выполнить или не выполнить — вот запись в моем блоге о терминологии обещаний)reject
- Отклоняет обещаниеЦель кода в функции-исполнителе — запустить любой асинхронный процесс, о котором будет сообщать промис, а затем (когда этот процесс завершится): 1) использовать resolve для выполнения промиса, 2) использовать resolve для выполнения промиса другое обещание или 3) используйте reject, чтобы отклонить обещание.
Показанная вами функция async делает следующее:
new Promise
.
Promise
синхронно вызывает переданную ему функцию-исполнитель, предоставляя ей доступ к функциям resolve
и reject
. Тот, который вы показали оптимистично (и, вероятно, неправильно), использует только параметр resolve
.waitingMessages.set(msg.id, resolve);
, который предположительно настраивает обработчик eevn, передающий resolve
в качестве реализации обработчика, а затем worker.postMessage(msg);
для отправки сообщения.await
s обещание. (Что заставляет SendMessage
возвращать промис, который он неявно создает; он урегулирует промис, который он возвращает позже.)waitingMessages
вызывает resolve
, что, вероятно, выполняет обещание с некоторым значением (значение выполнения).await
удовлетворен, а response
присваивается значение выполнения обещания, которое было await
ed.SendMessage
возвращает это значение, которое выполняет неявно возвращенное обещание SendMessage
, используя значение response
в качестве значения выполнения этого обещания.Я не стал вдаваться в подробности выше, но это суть.
Ничто из этого не связано конкретно с TypeScript, это просто то, как работают промисы JavaScript.
Я предлагаю прочитать Использование Promises на MDN или любое хорошее вводное руководство или книгу по Promise.
FWIW, я подробно рассматриваю обещания в главе 8 моей книги JavaScript: новые игрушки, а async/await подробно рассказываю в главе 9.
Спасибо за это очень четкое объяснение, я думаю, что теперь я понимаю, что делает этот фрагмент кода, и основы концепции промисов! А также я буду читать ресурсы, которые вы упомянули выше
Что он делает, так это создает Promise, который предоставляет вам функцию разрешения, которую вы можете запустить, чтобы отметить обещание как выполненное. Если вы await функцию SendMessage, выполнение кода остановится до тех пор, пока функция resolve не будет запущена.
Кажется, он добавляет идентификатор сообщения в какую-то форму очереди сообщений, а затем отправляет сообщение через веб-работника. Подробнее о веб-воркерах можно прочитать здесь
const result = await SendMessage(yourMessage);
console.info('These console.infos will not be run until something in your code..');
console.info('..executes the resolve function that was being stored via waitingMessages.set');
Это вопрос JavaScript. Посмотрите Обещания.