为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的嵌套承诺会返回未定义的?

为什么我的嵌套承诺会返回未定义的?

天涯尽头无女友 2022-09-29 15:47:02
这是我的代码:resolve: async (        _root,        { data: { password, interests, email, ...userData } },        { prisma }      ) => {        console.log('called reg');        const handleError = (error) => {          console.log('error: ', error);          return { token: null, error, userId: null };        };        return admin          .auth()          .createUser({            email,            password,            displayName: `${userData.firstName} ${userData.lastName}`,          })          .then((userRecord) => {            // See the UserRecord reference doc for the contents of userRecord.            console.log('Successfully created new user:', userRecord);            return admin              .database()              .ref('users/' + userRecord.uid)              .set(                {                  ...userData,                  interests,                },                (error) => {                  if (error) return handleError(error);                  else {                    return admin                      .auth()                      .createCustomToken(userRecord.uid)                      .then((token) => {                        console.log('token: ', token)                        return {                          token,                          error: null,                          userId: userRecord.uid,                        };                      }, handleError);                  }                }              );          }, handleError)          .then((result) => {            console.log('result: ', result);            return result;          });      },我在我的 graphql 解析器中使用嵌套,我的问题是,为什么最后一个结果然后返回未定义?我无法弄清楚,因为当我登录createCustomToken的回调时,令牌就在那里,所以我确保最终记录结果,但不幸的是,它是未定义的,基本上,我想使用.then并像这样捕获,而不是asyc /await,帮助?
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

不应在方法中使用回调,而应将 a 链接到该方法。使用回调时,该方法将返回随后在最后一个块中分配给的回调。火基文档setthensetundefinedresultthen


此外,您不必在每个方法中都提供相同的参数。您可以通过在最后链接方法来替换它们。handleErrorthencatch


...

return admin

  .database()

  .ref("users/" + userRecord.uid)

  .set({

    ...userData,

    interests,

  })

  .then(() => admin.auth().createCustomToken(userRecord.uid))

  .then((token) => {

    console.log("token: ", token);

    return {

      token,

      error: null,

      userId: userRecord.uid,

    };

  })

  .then((result) => {

    console.log("result: ", result);

    return result;

  }).catch(handleError);

在我看来,你的代码很难阅读。编写更具可读性的代码将使调试过程更容易,通常,异步/等待可以提高可读性。


async/await您的代码版本:


async (

  _root,

  { data: { password, interests, email, ...userData } },

  { prisma }

) => {

  try {

    const userRecord = await admin.auth().createUser({

      email,

      password,

      displayName: `${userData.firstName} ${userData.lastName}`,

    });

    console.log("Successfully created new user:", userRecord);

    await admin

      .database()

      .ref("users/" + userRecord.uid)

      .set({

        ...userData,

        interests,

      });

    const token = await admin.auth().createCustomToken(userRecord.uid);

    console.log("token: ", token);

    return {

      token,

      error: null,

      userId: userRecord.uid,

    };

  } catch (error) {

    console.log("error: ", error);

    return { token: null, error, userId: null };

  }

};

当然,可读性是主观的。选择一种你和你的队友喜欢的风格。


查看完整回答
反对 回复 2022-09-29
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信