【问题标题】:JS async queue with return data带有返回数据的 JS 异步队列
【发布时间】:2023-02-21 22:19:43
【问题描述】:

我想向 google api 发出异步请求并将结果保存在一个数组中。我试图以某种方式从 apiHandler 返回值的尝试失败了。我不知道我需要在哪里获取这些数据。你能帮助我吗?

我对 js 不是很有经验,更不用说异步 js 了。

import { queue } from "async";
import fetch from "node-fetch";

let concurrency = 10; // How many async processes will be running
let KEY = '';
let ids = [
    'sMTs5bvAsGA',
    'kW5X4dU0gnY',
    'dX2hyyKFIHA',
    '91egEkKuVas',
    'DfhKbYXRu6Q',
    'hQdOqC-1tVg',
    'AOwFmabnb7s',
];

let data = [];

export const taskQueue = queue(async (task, done) => {
    try {
        let data = await task();
        done;
        return data;
    } catch (err) {
        throw err;
    }
}, concurrency);

taskQueue.drain(() => {
    console.log("All items completed!\n");
    process.exit();
});

export function getItems(video_ids) {
    video_ids.forEach((id) => {
        taskQueue.push(() =>
            apiHandler(`https://www.googleapis.com/youtube/v3/search?part=snippet&relatedToVideo=${id}&maxResults=50&type=video&key=${KEY}`),

            (err) => {
                if (err) {
                    console.log(err);
                    throw new Error('Error getting data.');
                }
            })
    });
};

async function apiHandler(url) {
    const response = await fetch(url);
    const data = await response.json();
    return data;
}

getItems(ids);

【问题讨论】:

  • 不应该是done()而不是done吗?
  • 您的 api 处理程序不返回任何内容。您正在将函数推送到数组?
  • @Konrad,如果我将其更改为 done(),此代码将抛出异常“done 不是函数”
  • @epascarello,我删除了返回行
  • 我运行了您的代码,对我来说效果很好

标签: javascript node.js asynchronous google-api queue


【解决方案1】:

对于您的问题,构建 Promise 元素数组然后调用 .all() 似乎是有意义的。

Promise 是一个可以解析或拒绝的对象。假设您的fetch 是一个承诺,您可以执行以下操作:

1.创建一个空数组

您需要在某处创建一个空数组,该数组必须在算法的相关位置进行访问。为了简单起见,我将把它创建为一个变量:

let promises = [];

2.确保apiHandler返回一个承诺

function apiHandler(url) {
    return fetch(url).then((response) => {
        data.push(response);
    });
}

3. 在你的循环中滋​​润你的 promise 数组

    video_ids.forEach((id) => {
        promises.push(() =>
            apiHandler(`https://www.googleapis.com/youtube/v3/search?part=snippet&relatedToVideo=${id}&maxResults=50&type=video&key=${KEY}`),

            (err) => {
                if (err) {
                    console.log(err);
                    throw new Error('Error getting data.');
                }
            })
    });

4. 在某个地方,可能就在你的循环之后,创建一个 .all() 处理程序

Promise.all(promises).then((response) => {
    //do something
});

解释

.then().all() 调用也创建承诺,并且您将一组承诺传递给.all(),因此当所有承诺都得到履行时,将调用它的.then()。至于promises,它是由你的fetch调用的.then()处理程序构建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2020-06-01
    • 2020-11-25
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多