Javascript.Run 多个同步承诺
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#all
一起使用。当您创建一个承诺时,该操作已经在执行 - 只有 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
方法和并发参数。
这可能 w/o 使用生成器
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)
}
这背后的想法是建立承诺链,这样下一个就会等待前一个完成
我想请求一个网站 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#all
一起使用。当您创建一个承诺时,该操作已经在执行 - 只有 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
方法和并发参数。
这可能 w/o 使用生成器
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)
}
这背后的想法是建立承诺链,这样下一个就会等待前一个完成