Node.js — 需要睡眠

Posted

技术标签:

【中文标题】Node.js — 需要睡眠【英文标题】:Node.js — Sleep required 【发布时间】:2013-11-10 15:38:17 【问题描述】:

考虑以下场景:

在我的一项 cron 作业中,我正在请求其他人的服务,该服务仅允许请求 3600 秒。 API 类似于GetPersonForName=string。考虑到我的数据库中有几个people,我需要尽可能更新他们的信息,我扫描我的数据库中的所有人并调用这个API。示例

// mongodb-in-use
People.find(, function(error, people)
    people.forEach(function(person)
        var uri = "http://example.com/GetPersonForName=" + person.name
        request(
            uri : uri
        , function(error, response, body)
            // do some processing here
            sleep(3600) // need to sleep after every request
        )
    )
)

我不确定 sleep 是否是一种不错的方法,但我需要在每次发出请求后等待 3600 秒。

【问题讨论】:

为什么不使用 setTimeout 而不是睡眠 - 你可能还想研究 asyncjs (github.com/caolan/async) - 太棒了 如何在这个循环中为每个人使用 setTimeout?请举例? sha512boo 发布了一个 Answer 说“你可以在这个模块中使用 sleep https://www.npmjs.com/package/gytimer” 【参考方案1】:

您可以使用setTimeout 和递归函数来完成此操作:

People.find(, function(error, people)
    var getData = function(index) 
        var person = people[index]

        var uri = "http://example.com/GetPersonForName=" + person.name
        request(
            uri : uri
        , function(error, response, body)
            // do some processing here

            if (index + 1 < people.length) 
                setTimeout(function() 
                    getData(index + 1)
                , 3600)
            
        )
    

    getData(0)
)

【讨论】:

哦,那行得通。我只是对隐性函数内部的超时有点犹豫,但这很干净。谢谢!

以上是关于Node.js — 需要睡眠的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 非阻塞行为的新手查询

Yelp API - Node.js中每秒请求太多

前端Node.js需要掌握那些内容?

使用 NODE_MODULE_VERSION 64 针对不同的 Node.js 版本编译。此版本的 Node.js 需要 NODE_MODULE_VERSION 67

bindings.node' 是针对不同的 Node.js 版本使用 NODE_MODULE_VERSION 93 编译的。此版本的 Node.js 需要 NODE_MODULE_VERSION 89

Python 和 Visual Studio 需要安装 Node.js 模块(Superfeedr Node.js 包装器)