Javascript.同步运行多个承诺
Javascript.Run Multi promises Synchronously
我想申请一个网站40次。
我希望这是同步的,像10个请求4次。
这是我的代码,用于1次请求-40次:
'use strict';
var request = require('request');
var co = require('co');
function callUrl(url) {
return new Promise((resolve, reject) => {
request.get(url, (e, r, b) => {
if (e) reject(e)
else
resolve(`Response from ${url}`);
});
})
}
co(function*() {
for (var i = 1; i < 41; i++) {
let rs = yield callUrl('https://www.google.com/?q=' + i);
// let rs = yield makeUrls(10,i);
console.log(rs);
}
});
我可以做出一系列承诺,但我不知道如何将q
的值更改为不同的值。
你不想同步运行它们-你想同步它们-它们是不同的。
您可以将一系列promise与Promise#all
一起使用。当您创建一个promise时,操作已经在执行了——只有yield
会同步。
你可以像这样一次提出10个请求:
co(function*() {
for (var i = 1; i < 41;) {
var promises = [];
for(var lim = i + 10; i < Math.max(lim, 41); i++) {
promises.push(callUrl('https://www.google.com/?q=' + i));
}
let rs = yield Promise.all(promises); // wait for everything
console.log(rs); // an array of 10 results
});
请注意,除此之外,您的代码仍然不是很高效——如果10个请求中有9个请求非常快,而一个请求需要一分钟的时间,会发生什么?您将只有一个传出请求。您可以使用像bluebird
这样的库,该库具有更高效的带有并发参数的Promise.map
方法。
这可能在不使用生成器的情况下工作
const urls = [/*array of urls*/];
const initialPromise = request[urls[0]];
let promise = initialPromise;
for(let i= 1; i<40;i++){
let thenFunction = response => {
//do something with the response
return request(urls[i])
}
promise = promise.then(thenFunction)
}
这背后的想法是建立承诺链,这样下一个承诺将放弃上一个承诺来完成
相关文章:
- Javascript.同步运行多个承诺
- 如何将嵌套承诺与Q连锁?我可以'Don’我不能让它们按正确的顺序运行
- 如何同时运行两个承诺并在nodejs中一个接一个地失败
- 串联运行承诺
- .done() 函数在抓取本地 JSON 文件时未在 AJAX 调用返回的承诺上运行
- 承诺被拒绝后停止运行进程
- 使用承诺运行 Cheerios 的异步调用
- 然后 .then() 函数似乎在承诺完成之前运行
- 当满足承诺时,运行frisby测试
- 我如何运行async承诺没有承诺地狱
- 如何将同步函数与承诺链接起来以异步运行
- 解析.承诺不要在它被创建后继续运行
- (节点)运行n次的动态承诺
- 我如何按顺序运行mocha集成测试来链接承诺?
- 在Angular.js中,当一个承诺被履行时,如何总是运行一些代码
- Restangular 运行在承诺上实现回调,即使承诺被拒绝
- 为什么要在运行成功回调之前解析承诺?
- 为什么我的承诺里面的函数没有运行
- 并行运行承诺,但单独处理拒绝
- 如何捕获承诺运行时Javascript错误