這是使用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