【发布时间】:2015-07-02 17:04:25
【问题描述】:
首先,我在异步编程方面没有经验,所以如果我遗漏了一些明显的东西,我很抱歉。
我经常看到这个问题出现。我知道人们不喜欢在 Javascript 中强制同步,但在这种情况下这是必要的。我正在对生产数据库进行大量调用,由于使用频率很高,它不能承受太多负载。因此,我在循环中设置我的代码以发出请求,等待确认完成,休眠 2 秒,然后发出下一个请求。这是因为我将在大约 10 到 20 分钟的时间内每周从该服务器提取大量数据。
这是我拥有的代码。 Sleep 是一个使用 Date 类强制程序等待的函数。
var thread = function(cb){
cb();
};
do{
var x = thread(function(){
request.post(options, function(e, r, body){
console.log(e);
console.log(r.statusCode);
issues.push(body["issues"]);
maxResults = body["total"];
options.body.startAt += 25;
console.log("Going to sleep");
});
sleep(2000);
});
console.log("Waking up and moving to the next cycle");
}while(issues.length < maxResults);
console.log("Finished with the requests");
}
虽然我设置了回调,但我的代码仍在异步运行请求。因为我将 maxResults 保留为空,所以很明显我的回调不起作用。这是我的输出:
Waking up and moving to the next cycle
Finished with the requests
Going to sleep
【问题讨论】:
-
你不能那样做。相反,你应该使用 Promise。
-
我经常看到人们这么说,但我一直无法找到为此目的构建承诺的正确方法,即使在阅读了 bluebird 自述文件之后也是如此。在我看来,promise 更像是一种通过函数链接值的方式,而不是像我想要使用它们那样充当异步线程的连接。可以举个例子吗?
-
感谢您的帮助,但该示例并不真正适用于我的情况。我将循环的 while 条件基于每个 post 调用的结果。因此,我无法将所有异步函数完全放入列表中,以便在将来的某个时间按顺序解析。我需要在创建每个函数后对其进行解析。我一直在寻找一段时间,但我仍然无法找到如何强制使用 bluebird 解析函数。这可能不符合异步编码约定,但它对我正在使用的数据库至关重要。我需要进行 1000 次深度递归调用吗?
标签: javascript node.js asynchronous express