Как создать синхронизирующую версию асинхронного метода?

#javascript #node.js

#javascript #node.js

Вопрос:

Я пытаюсь добиться чего-то похожего на методы, которые вы получаете с модулем core fs, где у вас есть асинхронный метод по умолчанию и метод синхронизации по запросу, такой как fs.readDir() и fs.readDirSync() ;

У меня есть метод с именем fetchUrls , который извлекает файлы из списка URL-адресов и возвращает обещание. Я хочу добавить другой метод с именем fetchUrlsSync , который вызывает fetchUrls и блокирует поток до тех пор, пока не будет выполнено обещание. как это можно сделать?

пример кода:

 fetchUrls(startDate, endDate) {
    return new Promise((resolve, reject)=> {
        // some async work...
    })
}

fetchUrlsSync() {
 // call fetchUrls and block until resolved
}
  

эти две функции являются методами класса.

Комментарии:

1. Зачем вам это нужно?

2. Просто как удобный, потому что многие операции после него зависят от доступности файлов, и мне также любопытно, как это можно сделать.

3. Я не уверен, что вы можете это сделать, потому что, если ввод-вывод или любая другая операция в fetchUrls является асинхронной, все, что вы можете сделать, это разрешить возвращаемое обещание с помощью .then . В противном случае лучше всего переписать fetchUrlsSync, используя sync IO или операцию синхронизации

4. Существуют удобные способы выполнения действий после завершения операции. Я бы действительно посоветовал держаться подальше от синхронных решений: это плохая практика.

5. Вы не можете и не должны. Для этого и предназначен async / await.

Ответ №1:

Это невозможно непосредственно в node.js . Это также противоречит общей модели в node, которая заключается в выполнении всех операций ввода-вывода асинхронно.

Однако возможно использовать скомпилированный Node.js вызывается расширение для достижения этой цели http-sync .