首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析使用诺言的函数

解析使用诺言的函数
EN

Stack Overflow用户
提问于 2019-03-27 17:03:03
回答 3查看 456关注 0票数 1

我有以下异步函数

代码语言:javascript
运行
复制
export default async function getUserNames(id: string[]): Promise<string[]> {
    let userNames: string[] = [];
    // We do some stuff here like calling a service, etc...

    return userNames;
}

在另一个类型记录文件中,我导入了getuserNames函数,并试图这样调用它:

代码语言:javascript
运行
复制
const promiseResult = getUserNames(idList)
        .then(result => {
            return result;
        })
        .catch(error => {
            return undefined;
        });

    if (promiseResult) {
        // Do something else here.
    }

然而,promiseResult类型是有希望的,而不是我所期望的string[]。我如何调用getuserNames函数,当它完成时,实际的string[]返回给promiseResult变量?

编辑是接受做这样的事情吗?

代码语言:javascript
运行
复制
let varB: string[];
const promiseResult = getUserNames(idList)
        .then(result => {
            varB = result;
        })
        .catch(error => {
            varB = undefined;
        });

if (varB) {
        // Do something else here.
    }

最后,请注意,调用getUserNames的函数没有定义为异步,我无法更改它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-27 17:06:32

如果您希望访问承诺解析的值,则您的唯一选项是

1)使用承诺的.then回调

代码语言:javascript
运行
复制
getUserNames(idList)
  .then(result => {
    // Do something else here.
  })

2)将代码放入异步函数中,并使用await关键字:

代码语言:javascript
运行
复制
async function someFunction () {
  const result = await getUserNames(idList);
  // Do something else here.
}

注意,由于所有异步函数都返回承诺,因此在本例中,someFunction将返回一个承诺。

票数 3
EN

Stack Overflow用户

发布于 2019-03-27 17:08:04

getUserNames确实返回了一个promise<string[]>,这正是它的签名所显示的。

您应该在if (result)中执行then

或者您可以使用新的await关键字,这将确保承诺在分配给promiseResult之前被解析--在本例中,将您的await封装在try/catch中。

票数 0
EN

Stack Overflow用户

发布于 2019-03-27 17:16:30

您不需要在代码中使用异步/等待。

代码语言:javascript
运行
复制
/**
 * async data fetcher
 * @param {String} url 
 * @param {Object} options 
 * @returns {Promise}
 */
const fetch = (url, options) => {
  return new Promise((resolve, reject) => {
    fetch(url, options)
      .then((response) => {
        if (response.ok) {
          return resolve(response.json)
        }
        return reject(response.json)
      })
      .catch((error) => reject({ error }))
  })
}

/**
 * async fetch wrapper, returns a Promise
 * @param {NUmber} id 
 * @returns {Promise}
 */
const getUserNames = (id) => {
  return fetch('www.yourapi.com/get_user_names', { params: { id } })
}

const idList = [1, 2, 3]
// so, your code also will be asyncronious too:
Promise.all([getUserNames(idList)]).then((promiseResult) => {
  if (promiseResult) {
    // Do something else here.
  }
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55382802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档