我的nodejs应用程序中有一个名为get_source_at的函数。它接受uri作为参数,其目的是从该uri返回源代码。我的问题是,我不知道如何让函数同步调用请求,而不是给它提供回调函数。我希望控制流在加载uri所需的几秒钟内停止。我如何才能做到这一点?
function get_source_at(uri){
var source;
request({ uri:uri}, function (error, response, body) {
console.log(body);
});
return source;
}
另外,我读过“事件”和节点是如何“事件”的,我在写代码时应该尊重这一点。我很乐意这样做,但在继续我的应用程序的控制流程之前,我必须有一种方法来确保我有来自uri的源代码所以如果这不是通过使函数同步来实现的,那怎么做呢?
发布于 2014-12-25 03:37:42
您可以使用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;
}
发布于 2017-12-21 01:15:25
拥有一个简单的阻塞函数对于交互式开发来说是一个很大的好处!sync
函数(定义如下)可以同步任何promise,极大地减少了使用和学习API所需的语法量。例如,以下是如何在无头Chrome的puppeteer库中使用它:
var browser = sync(puppeteer.connect({ browserWSEndpoint: "ws://some-endpoint"}));
var pages = sync(browser.pages())
pages.length
1
var page = pages[0]
sync(page.goto('https://duckduckgo.com', {waitUntil: 'networkidle2'}))
sync(page.pdf({path: 'webpage.pdf', format: 'A4'}))
最好的部分是,这些代码行中的每一行都可以进行调整,直到它做了您想要做的事情,而不必在每次要测试它时重新运行或重新键入前面的所有行。这是因为您可以从顶层直接访问browser
和pages
变量。
下面是它的工作原理:
const deasync = require("deasync");
const sync = deasync((promise, callback) => promise.then(result) => callback(null, result)));
它使用了其他答案中提到的deasync包。deasync
为匿名函数创建了一个部分应用程序,该函数将callback
作为最后一个参数添加,并在调用callback
之前一直阻塞。callback
接收错误条件作为第一个参数(如果有),并接收结果作为第二个参数(如果有)。
发布于 2012-03-27 15:21:05
好的,首先,要使代码保持异步,只需将相关代码放在请求函数的回调中,这意味着它将在请求完成后运行,但不会停止处理器处理应用程序中的其他任务。如果您多次需要它,我建议您查看Synchronous request in Node.js,它概述了各种方法以使其更流畅,并讨论了各种控制流库。
https://stackoverflow.com/questions/9884418
复制相似问题