我怎样才能使这个调用请求在nodejs同步?

我在我的nodejs应用程序中有一个名为get_source_at的函数。 它以uri为参数,其目的是从该uri返回源代码。 我的问题是,我不知道如何使该function同步调用请求,而不是给它的callback函数。 我控制stream程停止加载uri所需的几秒钟。 我怎样才能做到这一点?

function get_source_at(uri){ var source; request({ uri:uri}, function (error, response, body) { console.log(body); }); return source; } 

另外,我已经阅读了“事件”以及节点是如何“放下”的,我应该尊重这一点,写我的代码。 我很高兴做到这一点,但我必须有一种方法来确保我有一个uri的源代码,然后再继续我的应用程序的控制stream程 – 所以如果这不是通过使function同步,怎么做?

你应该避免同步请求。 如果你想要像同步控制stream,你可以使用asynchronous 。

 async.waterfall([ function(callback){ data = get_source_at(uri); callback(null, data); }, function(data,callback){ process(data, callback); }, ], function (err,result) { console.log(result) }); 

process承诺 get_source_at返回运行。

你可以与deasync :

 function get_source_at(uri){ var source; request({ uri:uri}, function (error, response, body) { source = body; console.log(body); }); while(source === undefined) { require('deasync').runLoopOnce(); } return source; } 

这是使用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函数包装。 但是对于像cb(err, data)这样的不能返回的函数。 您可以使用自定义cb(err, data)callback格式来创build自己的函数(命名或匿名),就像我在上面的代码中所做的一样。 这样,您可以通过等待callbackcb(err, data)返回到不同的javascript层(如文档所述cb(err, data)来强制几乎所有asynchronous函数执行同步。 还要确保你已经覆盖了所有的方法从你用cb(err, data)callback取消同步的函数中退出,否则你的程序将被阻塞。

希望它帮助那里的人!

在继续执行应用程序的控制stream程之前,我必须有办法确保从uri获得源代码 – 所以如果不是通过使函数同步,怎么做?

鉴于这个入口点你的应用程序:

 function app(body) { // Doing lots of rad stuff } 

你通过获取身体来启动它:

 request({ uri: uri }, function (error, response, body) { if(err) return console.error(err); // Start application app(body); } 

这是你在编写node.js(和一般的javascript)时必须习惯的东西。 有像asynchronous(我也推荐)的控制stream模块,但你必须习惯于继续传递样式 ,因为它被称为。

好的,首先,为了使代码保持asynchronous,您可以简单地将相关的代码放在请求函数的callback中,这意味着在请求结束后它将运行,但是不会停止处理器处理应用程序中的其他任务。 如果您需要多次,我build议您检查Node.js中的同步请求,其中列出了各种方法以使其更加精简,并讨论了各种控制stream库。