这是使用 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 编写基于 Promise 的同步查找代码。您可以使用request-promise-native
npm module来避免自己用Promise 包装请求module。