如何保证所有请求都异步完成,并将请求url映射到Node.js10.x.x中的promise响应?
How to guarantee all requests are fulfilled asynchronously, and map the request url to the promise response in Node.js 10.x.x?
我有几个 GET 请求需要发出,由于超时限制,它们必须 运行 异步,我需要保证所有 运行。另外,当结果 returns 时,我需要知道它指向哪个 URL。
我设法解决了第一部分,但我无法映射到正确的 url。这是代码:
urls = ['https://example-a.com', 'https://example-b.com', 'https://example-c.com']
Promise.all(promises.map(p => fetch(p.url))).then(function(res){
var blobPromises = [];
/* HERE I WOULD LIKE TO KNOW WHICH URL'S REQUEST WAS RETURNED */
for (var j = 0; j < urls.length - 1; j++) {
blobPromises.push(res[j].text());
}
return Promise.all(blobPromises);
}).then(function(body){
var output = {rawData: body)};
callback(null, output);
}).catch(callback);
这个映射如何完成?
您似乎错误地假设 Promise.all
的 then 处理程序为每个承诺调用一次。它被调用一次(如果不是所有的承诺都解决,则永远不会)使用一个包含每个承诺的解决的数组(与他们的承诺相同的顺序)。
let promises = [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)];
Promises.all(promises).then(resolveObjects =>
console.log(resolveObjects)); // [1, 2, 3]
对于您的示例(稍作修改,因为您的代码缺少一些变量和不正确的语句):
urls = ['https://example-a.com', 'https://example-b.com', 'https://example-c.com']
let promises = urls.map(url => fetch(url));
let responses = Promise.all(promises).then(responses =>
responses.map(respnose => response.text()));
(旁注),异步流依赖项(例如 https://www.npmjs.com/package/bs-better-stream)将允许您更像普通数组一样处理数组的承诺或承诺数组(或承诺数组的承诺...)。
let responses = new Stream()
.writePromise(...promises)
.map(response => response.text());
我有几个 GET 请求需要发出,由于超时限制,它们必须 运行 异步,我需要保证所有 运行。另外,当结果 returns 时,我需要知道它指向哪个 URL。
我设法解决了第一部分,但我无法映射到正确的 url。这是代码:
urls = ['https://example-a.com', 'https://example-b.com', 'https://example-c.com']
Promise.all(promises.map(p => fetch(p.url))).then(function(res){
var blobPromises = [];
/* HERE I WOULD LIKE TO KNOW WHICH URL'S REQUEST WAS RETURNED */
for (var j = 0; j < urls.length - 1; j++) {
blobPromises.push(res[j].text());
}
return Promise.all(blobPromises);
}).then(function(body){
var output = {rawData: body)};
callback(null, output);
}).catch(callback);
这个映射如何完成?
您似乎错误地假设 Promise.all
的 then 处理程序为每个承诺调用一次。它被调用一次(如果不是所有的承诺都解决,则永远不会)使用一个包含每个承诺的解决的数组(与他们的承诺相同的顺序)。
let promises = [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)];
Promises.all(promises).then(resolveObjects =>
console.log(resolveObjects)); // [1, 2, 3]
对于您的示例(稍作修改,因为您的代码缺少一些变量和不正确的语句):
urls = ['https://example-a.com', 'https://example-b.com', 'https://example-c.com']
let promises = urls.map(url => fetch(url));
let responses = Promise.all(promises).then(responses =>
responses.map(respnose => response.text()));
(旁注),异步流依赖项(例如 https://www.npmjs.com/package/bs-better-stream)将允许您更像普通数组一样处理数组的承诺或承诺数组(或承诺数组的承诺...)。
let responses = new Stream()
.writePromise(...promises)
.map(response => response.text());