代码之家  ›  专栏  ›  技术社区  ›  diegoaguilar

承诺延迟执行

  •  0
  • diegoaguilar  · 技术社区  · 8 年前

    我试图通过以下方式实现承诺的延迟:

    function postAndSetContentfulId (client, code) {
      return delay().then(_ => {
        return postToContentful(client, code).then(setCode)
      })
    }
    
    function delay () {
      let multipler = Math.floor((count++) / 100) + 1
      let milliseconds = multipler * 2000
      return new Promise(resolve => setTimeout(() => resolve(), milliseconds))
    }
    

    为了避免速率限制问题,我需要延迟第三方API调用。当我被一堆人处决的时候,这似乎不起作用。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jaromanda X    8 年前

    我有一个简单的利率限制承诺队列,我几年前写的,这对我很有帮助。

    const rateLimited = perSecond => {
        const milliSeconds = Math.floor(1000 / perSecond);
        let promise = Promise.resolve(Date.now());
        return fn => promise.then(lastRun => {
            const wait = Math.max(0, milliSeconds + lastRun - Date.now());
            promise = promise.then(() => new Promise(resolve => setTimeout(resolve, wait))).then(() => Date.now());
            return promise.then(() => fn());
        });
    };
    
    const example = rateLimited(2); // 2 per second for the example
    let allPromises = Array.from({length:10}, (_, i) => i)
        .map(v => example(() => Promise.resolve(v)));
    console.time('Elapsed');
    console.log('Started - should take 5 seconds');
    Promise.all(allPromises).then(results => {
        console.log(results);
        console.timeEnd('Elapsed');
    });

    对于您的代码,您将使用 rateLimited 喜欢

    const q = rateLimited(20); // 20 per second limit for example
    function postAndSetContentfulId(client, code) {
        return q(() => postToContentful(client, code).then(setCode));
    }