将计时器添加到Promise.all,地图 [英] Add timer to Promise.all, map

查看:59
本文介绍了将计时器添加到Promise.all,地图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在下面的get请求之间添加一些超时.我的意思是,流程应类似于: timeout,https://example.com/example1、timeout、https://example.com/example2、timeout、https://example.com/example3、timeout 等(或没有第一次超时的情况).

I would like to add some timeout between below get requests. I mean, flow should be looks like: timeout, https://example.com/example1, timeout, https://example.com/example2, timeout, https://example.com/example3, timeout etc. (or without first timeout, whatever).

以下功能正常运行:

function promiseGetInformationFromMultipleUrls(parts) {
    return Promise.all(parts.map(part => {
      return request({
            'url': `https://example.com/${part}`,
            'json': true
        }).then(partData =>  {console.log("Part data was fetched: " + part); return partData.result;})
          .catch(err => {console.error("Error during fetching data from part: " + part + ", error code: " + err.statusCode);});
    }));
}

其中的部分是-> example1,example2,example3 ....

Where parts is -> example1, example2, example3....

我正在尝试通过添加计时器来做到这一点:

I am trying do it by adding timer:

const timer = ms => new Promise( res => setTimeout(res, ms));

并使用它:

function promiseGetInformationFromMultipleUrls(parts) {
    return Promise.all(parts.map(part => {
    console.log("wait 1 seconds");
    timer(1000).then(_=>console.log("done"));
      return request({
            'url': `https://example.com/${part}`,
            'json': true
        }).then(partData =>  {console.log("Part data was fetched: " + part); return partData.result;})
          .catch(err => {console.error("Error during fetching data from part: " + part + ", error code: " + err.statusCode);});
    }));
}

但这是错误的流程-> 超时,超时,超时,...,获取request1,获取请求2,获取请求3 .

But it is wrong flow -> timeout, timeout, timeout,..., get request1, get request 2, get request 3.

推荐答案

您可以将其简化为Promise链:

You may reduce it to a Promise chain:

function promiseGetInformationFromMultipleUrls(parts) {
 return parts.reduce((chain, part) =>
  chain.then((result) =>
    timer(1000).then(() => 
      request(/*...*/).then(res => 
        result.concat(res)
      )
    )
  ),
  Promise.resolve([])
);
}

但是那很丑陋,所以您可以使用async/await代替:

However thats quite ugly, so you may use async / await instead:

 async function promiseGetInformationFromMultipleUrls(parts){
   const result = [];
   for(const part of parts){
     await timer(1000);
     result.push(await request(/*...*/));
  }
  return result;
}

这篇关于将计时器添加到Promise.all,地图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆