这是使用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)
请参考documentation of deasync,你会发现,你可以使用
desync(function (n params, cb) {})
使功能其中cb
应该回来与(err, data)
。所以fs.readFile()
类似的功能可以很容易地用deasync
函数包装。但是,对于像request
功能不回来与cb(err, data)
。您可以使用自定义的cb(err, data)
回调格式为您创建自己的函数(有名或无名),就像我在上面的代码中所做的一样。通过这种方式,您可以通过等待回调cb(err, data)
回到不同的JavaScript层(如文档所述)来强制几乎任何异步函数执行同步。还要确保你已经覆盖了所有的方法从你正在用cb(err, data)
回调进行deasync包装的功能中脱身,否则你的程序将被阻止。
希望,它可以帮助那里的人!
更新:
不要使用这种做同步请求的方式。使用Async/Await写入基于同步代码的promise。您可以使用request-promise-native
npm模块来避免自己承诺包装请求模块。
虽然赖的答案在技术上是正确的(所以我将其标记为答案),但我最终的解决方案需要更多的工作。如果您有不确定数量的呼叫请求,则可以使用https://gist.github.com/2234466 – Trindaz 2012-03-29 08:53:01