[英]Returning a promise in async function - What is a more elegant / better practice solution?
我對async / await相當陌生,盡管以下代碼似乎可以正常工作,但我認為必須有一種更為優雅/最佳實踐的方式來編寫此函數:
/**
*
* @param {string} email user email address
* @description validates project exists and project owner is userId.
* @returns {Promise} resolves userId if found otherwise null
*/
async getUserFirstAndLastName (userId) {
var userName;
return new Promise(function(resolve, reject){
var params = {
UserPoolId: process.env.userPoolId, /* required */
AttributesToGet: [
'given_name',
'family_name'
/* more items */
],
Filter: `sub = \"${userId}\"`
};
console.log("UserUtils DDB Get User First and Last Name:" + JSON.stringify(params, null,' '));
cognitoidentityserviceprovider.listUsers(params, function(err, data) {
if(err){ // an error occurred
console.log(err, err.stack);
reject(err); // throw error
}
else { // successful response
console.log("Data: " + JSON.stringify(data, null,' '));
if(data.Users.length){
userName = data.Users[0].Attributes[0].Value + " "; // First Name
userName += data.Users[0].Attributes[1].Value; // Last Name
resolve(userName); //return
}
else {
resolve(null); // no user found that matches email
}
}
});
});
}
尋求指導...
您的代碼問題確實似乎在以下方面:
cognitoidentityserviceprovider.listUsers(params, function(err, data) {
...
});
您想要編寫代碼的真正方法是,不是讓listUsers
函數接受回調,而是返回一個promise。 然后,您可以通過以下方式編寫代碼:
async getUserFirstAndLastName (userId) {
const params = {
UserPoolId: process.env.userPoolId, /* required */
AttributesToGet: [
'given_name',
'family_name'
/* more items */
],
Filter: `sub = \"${userId}\"`
};
try {
const data = await cognitoidentityserviceprovider.listUsers(params);
if(data.Users.length){
let userName = data.Users[0].Attributes[0].Value + " "; // First Name
userName += data.Users[0].Attributes[1].Value; // Last Name
return userName;
}
else {
return null; // no user found that matches email
}
}catch(err) {
throw err;
});
});
}
假設您不能直接重寫該listUsers
函數,則可以編寫一個將其轉換為返回promise的函數的函數,如下所示:
function convertCallbackFnToAsyncFn(fn) {
//Note that we are returning a function
return (...args) => new Promise(function(resolve, reject){
fn(...args, (err, data) => {
if (err) {
reject(err);
}
else {
resolve(data);
}
});
});
}
並將其與上述解決方案配合:
try {
//I'm just naming it newFunction here to be really clear about what we're doing
const newFunction = convertCallbackFnToAsyncFn(cognitoidentityserviceprovider.listUsers);
const data = await newFunction(params);
....
請注意,我在答案中使用了一些ES6傳播/休息和粗箭頭語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.