batchFetchingGeneratorWrapper

batchFetchingGeneratorWrapper

我还有一个异步问题,我迷路了,不知道在哪里或如何修复它。原谅我不好的名字。

api调用twitch api并返回其结果数组。

  exports.batchPromiseWrapper = function(arr) {
  const filteredMungedDataArr = [];

  let promiseBatachArray = arr.map(vod_id => {
    var url = `https://api.twitch.tv/kraken/videos/${vod_id.id}/markers`;
    var params = { api_version: 5 };

    return axios
      .get(url, {
        params: params,
        headers: {
          "Client-ID": "xxxxxxxxxxxxxxx"
        }
      })
      .then(res => {
        return res.data;
      })
      .catch(function(error) {
        console.log(error);
      });
  });

  return Promise.all(promiseBatachArray)
    .then(markers => {
      if (markers !== null) {
        markers.map(markerObj => {
          if (markerObj.markers.game_changes !== null) {
            markerObj.markers.game_changes.forEach(gameName => {
              if (gameName.label === "Fortnite") {
                filteredMungedDataArr.push(markerObj);
              }
            });
          }
        });
        return filteredMungedDataArr;
      }
    })
    .catch(err => {
      if (err.status === 500 || err.status === 404) {
        console.log("error: ", err, err.message);
      }
    });
};


数据如下所示:
[[1,2,3,4,5],[1,2,3,4,5]],生成器将产生并做出promise.all调用5,然后暂停5秒并继续到下一批5。

exports.batchFetchingGeneratorWrapper = function(generator, batchArray) {
  let evalNextValue = generator.next();

  let delay = (v, t) => {
    return new Promise(resolve => {
      setTimeout(resolve.bind(null, v), t);
    });
  };

  if (!evalNextValue.done) {
    exports.batchPromiseWrapper(evalNextValue.value).then(data => {
      let newBatchArray = batchArray;
      if (data !== undefined) {
        newBatchArray = batchArray.concat(data);
      }

      delay(5000).then(() => {
        exports.batchFetchingGeneratorWrapper(generator, newBatchArray);
      });
    });
  } else {
    console.log("yay done!", batchArray);
    return batchArray;
  }
};


我可以从batchFetchingGeneratorWrapper的batchArray中管理结果,但是我无法对其进行操作,并且我知道它与异步有关,以及如何解决它。

promiseDataWrapper
  .then(data => {
    return gatherData.cleanUpVODData(data);
  })
  .then(data => {
    function* batchFetching(batchArray) {
      for (let i = 0; i < batchArray.length; i++) {
        yield batchArray[i];
      }
    }

    let batchArrResult = [];
    let g = batchFetching(data);

    new Promise((resolve, reject) => {
      gatherData.batchFetchingGeneratorWrapper(g, batchArrResult);

      if (g.done) { // i dont think this works
        console.log("batchArrResult 1: ", batchArrResult);
        resolve(batchArrResult);
      }
    }).then(result => console.log("asdfasdf", batchArrResult)); // empty array is returned
  });

最佳答案

据我所知,问题主要出在batchFetchingGeneratorWrapper()上。

应该是:


修复delay()
做出适当的回报以使递归工作
确保函数返回Promise


毫无疑问,async / await几乎(在语法上)更简单,但是在这里它是老式的thens:

exports.batchFetchingGeneratorWrapper = function(generator, batchArray) {
    let evalNextValue = generator.next();
    let delay = (t) => {
        return new Promise(resolve => {
            setTimeout(resolve, t);
        });
    };
    if (!evalNextValue.done) {
        return exports.batchPromiseWrapper(evalNextValue.value).then(data => {
            return delay(5000).then(() => {
                return exports.batchFetchingGeneratorWrapper(generator, batchArray.concat(data || []));
            });
        });
    } else {
        console.log("yay done!", batchArray);
        return Promise.resolve(batchArray); // <<< promise wrapped to ensure that batchFetchingGeneratorWrapper() returns Promise
    }
};


并适当地链接batchFetchingGeneratorWrapper()调用:

promiseDataWrapper
.then(data => gatherData.cleanUpVODData(data))
.then(data => {
    function* batchFetching(batchArray) {
        for (let i = 0; i < batchArray.length; i++) {
            yield batchArray[i];
        }
    }
    return gatherData.batchFetchingGeneratorWrapper(batchFetching(data), []).then(batchArrResult => {
        console.log('batchArrResult: ', batchArrResult);
        return batchArrResult;
    });
}).catch(error => {
    console.log(error);
});

09-17 15:37