蓝鸟请求函数
Bluebird Request Function
我有一个关于此 post 的后续问题:Chaining Requests using BlueBird/ Request-Promise
我对承诺很陌生,所以请原谅我的幼稚。我成功地实现了这段代码:
var BPromise = require('bluebird');
var rp = require('request-promise');
BPromise.all([
rp(optionsForRequest1),
rp(optionsForRequest2)
])
.spread(function (responseRequest1, responseRequest2) {
// Proceed with other calls...
})
.catch(function (err) {
// Will be called if at least one request fails.
});
但就我而言,特定的 url 每次都不同。我想获取新的 URL 数组,为每个 URL 构造选项对象,然后是 rp()。
当我从字面上构造一个像这样的数组时 - var freshArray =[rp({Uri1 w/options}), rp({Uri2 w/options}), etc]
并将其粘贴到上面的 .all( ) 中 - 运气不好。我认为 rp() 的实现独立于 BPromise.all 调用?
如何将构造的承诺数组动态嵌入到上面的代码中?
我不太确定你想做什么,但是
BPromise.all([optionsForRequest1, optionsForRequest2].map((url) => {
const urlWithOptions = someFunction(url);
return rp(urlWithOptions);
})])
.spread(function (responseRequest1, responseRequest2) {
// Proceed with other calls...
})
.catch(function (err) {
// Will be called if at least one request fails.
});
工作?如果是这样,您甚至可以在地图
中使用 (url) => rp(someFunction(url))
来缩短它
===编辑===
(x) => y
是一个 es6 shorthand,大部分时间都像 function(x) { return y; }
(x) => { ... return y; }
是一个类似的shorthand,让你有中间变量。
互联网上关于 es6 的更多信息 :) 如 here
.map
是在数组上定义的函数。它将函数应用于每个元素,因此 [1, 2].map((x) => x + 1)
returns [2, 3]
所以代码就像
var urls = [optionsForRequest1, optionsForRequest2];
var urlsWithOptions = [];
for (var k in urls) {
urlsWithOptions.push(someFunction(urls[k]));
}
BPromise.all(urlsWithOptions)
...
如果您使用的是 Bluebird,并且您有一个任意数组想要与异步操作并行处理,那么您应该使用 Bluebird 的 Promise.map()
,因为它是针对这种情况的快捷方式:
var requestOptionsArray = [{...}, {...}, {...}];
Promise.map(requestOptionsArray, function(item) {
return rp(item);
}).then(function(results) {
// all results here
}).catch(function(err) {
// error here
});
Promise.map()
是迭代数组的快捷方式,对数组中的每个项目调用一个承诺生成函数,累积所有承诺,然后用所有承诺调用 Promise.all()
。它不是所有这些步骤,而是一步为您完成所有这些。最终结果是一个有序结果数组。这些操作都是 运行 并行的。
如果要序列化操作,可以使用Promise.mapSeries()
。如果你想控制同时有多少请求在飞行中,你可以将 {concurrency: 3}
选项传递给 Promise.map()
(对于不让目标服务器一次被太多请求压垮或避免某些请求很有用)一次请求过多可能会限制速率的情况。
我有一个关于此 post 的后续问题:Chaining Requests using BlueBird/ Request-Promise
我对承诺很陌生,所以请原谅我的幼稚。我成功地实现了这段代码:
var BPromise = require('bluebird');
var rp = require('request-promise');
BPromise.all([
rp(optionsForRequest1),
rp(optionsForRequest2)
])
.spread(function (responseRequest1, responseRequest2) {
// Proceed with other calls...
})
.catch(function (err) {
// Will be called if at least one request fails.
});
但就我而言,特定的 url 每次都不同。我想获取新的 URL 数组,为每个 URL 构造选项对象,然后是 rp()。
当我从字面上构造一个像这样的数组时 - var freshArray =[rp({Uri1 w/options}), rp({Uri2 w/options}), etc]
并将其粘贴到上面的 .all( ) 中 - 运气不好。我认为 rp() 的实现独立于 BPromise.all 调用?
如何将构造的承诺数组动态嵌入到上面的代码中?
我不太确定你想做什么,但是
BPromise.all([optionsForRequest1, optionsForRequest2].map((url) => {
const urlWithOptions = someFunction(url);
return rp(urlWithOptions);
})])
.spread(function (responseRequest1, responseRequest2) {
// Proceed with other calls...
})
.catch(function (err) {
// Will be called if at least one request fails.
});
工作?如果是这样,您甚至可以在地图
中使用(url) => rp(someFunction(url))
来缩短它
===编辑===
(x) => y
是一个 es6 shorthand,大部分时间都像function(x) { return y; }
(x) => { ... return y; }
是一个类似的shorthand,让你有中间变量。互联网上关于 es6 的更多信息 :) 如 here
.map
是在数组上定义的函数。它将函数应用于每个元素,因此[1, 2].map((x) => x + 1)
returns[2, 3]
所以代码就像
var urls = [optionsForRequest1, optionsForRequest2];
var urlsWithOptions = [];
for (var k in urls) {
urlsWithOptions.push(someFunction(urls[k]));
}
BPromise.all(urlsWithOptions)
...
如果您使用的是 Bluebird,并且您有一个任意数组想要与异步操作并行处理,那么您应该使用 Bluebird 的 Promise.map()
,因为它是针对这种情况的快捷方式:
var requestOptionsArray = [{...}, {...}, {...}];
Promise.map(requestOptionsArray, function(item) {
return rp(item);
}).then(function(results) {
// all results here
}).catch(function(err) {
// error here
});
Promise.map()
是迭代数组的快捷方式,对数组中的每个项目调用一个承诺生成函数,累积所有承诺,然后用所有承诺调用 Promise.all()
。它不是所有这些步骤,而是一步为您完成所有这些。最终结果是一个有序结果数组。这些操作都是 运行 并行的。
如果要序列化操作,可以使用Promise.mapSeries()
。如果你想控制同时有多少请求在飞行中,你可以将 {concurrency: 3}
选项传递给 Promise.map()
(对于不让目标服务器一次被太多请求压垮或避免某些请求很有用)一次请求过多可能会限制速率的情况。