我具有以下异步功能
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的函数未定义为异步,并且我无法对其进行更改。
答案 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.
}
})