首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在nodejs中同步调用request?

如何在nodejs中同步调用request?
EN

Stack Overflow用户
提问于 2012-03-27 14:31:18
回答 3查看 100.6K关注 0票数 21

我的nodejs应用程序中有一个名为get_source_at的函数。它接受uri作为参数,其目的是从该uri返回源代码。我的问题是,我不知道如何让函数同步调用请求,而不是给它提供回调函数。我希望控制流在加载uri所需的几秒钟内停止。我如何才能做到这一点?

代码语言:javascript
复制
function get_source_at(uri){
    var source;
    request({ uri:uri}, function (error, response, body) {
        console.log(body);
    });
    return source;
}

另外,我读过“事件”和节点是如何“事件”的,我在写代码时应该尊重这一点。我很乐意这样做,但在继续我的应用程序的控制流程之前,我必须有一种方法来确保我有来自uri的源代码所以如果这不是通过使函数同步来实现的,那怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2014-12-25 03:37:42

您可以使用deasync

代码语言:javascript
复制
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;
}
票数 18
EN

Stack Overflow用户

发布于 2017-12-21 01:15:25

拥有一个简单的阻塞函数对于交互式开发来说是一个很大的好处!sync函数(定义如下)可以同步任何promise,极大地减少了使用和学习API所需的语法量。例如,以下是如何在无头Chrome的puppeteer库中使用它:

代码语言:javascript
复制
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'}))

最好的部分是,这些代码行中的每一行都可以进行调整,直到它做了您想要做的事情,而不必在每次要测试它时重新运行或重新键入前面的所有行。这是因为您可以从顶层直接访问browserpages变量。

下面是它的工作原理:

代码语言:javascript
复制
const deasync = require("deasync");
const sync = deasync((promise, callback) => promise.then(result) => callback(null, result)));

它使用了其他答案中提到的deasync包。deasync为匿名函数创建了一个部分应用程序,该函数将callback作为最后一个参数添加,并在调用callback之前一直阻塞。callback接收错误条件作为第一个参数(如果有),并接收结果作为第二个参数(如果有)。

票数 4
EN

Stack Overflow用户

发布于 2012-03-27 15:21:05

好的,首先,要使代码保持异步,只需将相关代码放在请求函数的回调中,这意味着它将在请求完成后运行,但不会停止处理器处理应用程序中的其他任务。如果您多次需要它,我建议您查看Synchronous request in Node.js,它概述了各种方法以使其更流畅,并讨论了各种控制流库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9884418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档