Это лучший способ использования deasync.
var request = require("request")
var deasync = require("deasync")
var getHtml = deasync(function (url, cb) {
var userAgent = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"}
request({
url: url,
headers: userAgent
},
function (err, resp, body) {
if (err) { cb(err, null) }
cb(null, body)
})
})
var title = /<title>(.*?)<\/title>/
var myTitle = getHtml("http://www.yahoo.com").match(title)[1]
console.log(myTitle)
Пожалуйста, обратитесь к документации по deasync , вы найдете, что вы можете использовать
desync(function (n params, cb) {})
, чтобы сделать функцию , где cb
должен вернуться с (err, data)
.Так что fs.readFile()
подобные функции можно легко обернуть с помощью функции deasync
.Но для таких функций, как request
, которые не возвращаются с cb(err, data)
.Вы можете создать собственную функцию (именованную или анонимную) с пользовательским форматом обратного вызова cb(err, data)
, как я делал в приведенном выше коде.Таким образом, вы можете заставить почти любую асинхронную функцию работать как синхронизация, ожидая, когда обратный вызов cb(err, data)
вернется на другой уровень javascript (как сказано в документации).Также убедитесь, что вы рассмотрели все способы выхода из функции, которую вы оборачиваете с помощью deasync с cb(err, data)
обратными вызовами, в противном случае ваша программа заблокируется.
Надеюсь, это кому-то поможет!
Обновление:
Не используйте этот способ выполнения синхронных запросов.Используйте Async / Await для написания обещаний на основе синхронного кода.Вы можете использовать модуль request-promise-native
npm, чтобы самостоятельно не связывать модуль запросов с обещаниями.