解决使用Promise的功能

时间:2019-03-27 17:03:04

标签: javascript node.js typescript promise

我具有以下异步功能

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函数并尝试像这样调用它:

const promiseResult = getUserNames(idList)
        .then(result => {
            return result;
        })
        .catch(error => {
            return undefined;
        });

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

但是,promise的PromiseResult类型而不是我期望的string []。如何调用getuserNames函数,完成后如何将实际的string []返回给promiseResult变量?

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

let varB: string[];
const promiseResult = getUserNames(idList)
        .then(result => {
            varB = result;
        })
        .catch(error => {
            varB = undefined;
        });

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

最后,请注意,调用getUserNames的函数未定义为异步,并且我无法对其进行更改。

3 个答案:

答案 0 :(得分:3)

如果您想访问Promise解析为的值,则唯一的选择是

1)使用promise的.then回调

getUserNames(idList)
  .then(result => {
    // Do something else here.
  })

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

async function someFunction () {
  const result = await getUserNames(idList);
  // Do something else here.
}

请注意,由于所有异步函数都返回promise,因此在此示例中,someFunction将返回promise。

答案 1 :(得分:0)

getUserNames确实返回了一个promise<string[]>,这正是其签名所言。

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

或者您可以使用新的await关键字,以确保在将诺言分配给promiseResult之前将其兑现 在这种情况下,请将您的await包装在try / catch中。

答案 2 :(得分:0)

您无需在代码中使用async / await。

/**
 * 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.
  }
})