typescript Promise.all()的类型

wn9m85ua  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(207)

我无法弄清楚请求元组返回类型和Promise.all()之间的这些类型。
有什么想法吗?

const createPromises = async (utteranceObject: Array<string[]>): 
  Promise<Array<[string, Blob]>> => {
  const promises = utteranceObject.map((keyValue) => {
    return buildAudioFetchRequests(keyValue[0], keyValue[1]);
  });
  return Promise.all<Promise<[string, Blob]>[]>(promises);
};

const buildAudioFetchRequests = (key: string, url: string): 
     [string, Promise<[string, Blob]>] => {
  return [key, useAuthenticatedFetch(url, { initialCache: false })];
};

hgncfbus

hgncfbus1#

您在基于变量名称promises的代码中有一个误解。
buildAudioFetchRequests的返回类型不是一个promise,它是一个键和一个promise的元组。因为await不关心对象或数组的内容,所以await返回相同的元组。
基于所有其他返回类型,您似乎希望等待属于元组的所有返回承诺,因此改为如下所示:

const createPromises = async (utteranceObject: Array<string[]>): 
  Promise<Array<[string, Blob]>> => {

  // Rename this variable here
  const requests = utteranceObject.map((keyValue) => {
    return buildAudioFetchRequests(keyValue[0], keyValue[1]);
  });

  // Get the actual promise from the tuple
  const promises = requests.map((req) => req[1]);

  // You can even remove the explicit typing from here because it's all as intended now!
  return Promise.all(promises);
};

const buildAudioFetchRequests = (key: string, url: string): 
     [string, Promise<[string, Blob]>] => {
  return [key, useAuthenticatedFetch(url, { initialCache: false })];
};

根据伯吉的评论:
当你所做的只是忽略它的时候,为什么还要从buildAudioFetchRequests的元组中返回key呢?
如果确实没有在任何地方使用该函数返回值的键,也可以这样做:

const createPromises = async (utteranceObject: Array<string[]>): 
  Promise<Array<[string, Blob]>> => {
  const promises = utteranceObject.map((keyValue) => {
    return buildAudioFetchRequests(keyValue[0], keyValue[1]);
  });

  // Remove explicit typing here
  return Promise.all(promises);
};

const buildAudioFetchRequests = (key: string, url: string): 
     // Change the returntype here
     Promise<[string, Blob]> => {

  // Change the return value here
  return useAuthenticatedFetch(url, { initialCache: false });
};

相关问题