代码之家  ›  专栏  ›  技术社区  ›  Nico Müller

嵌套的依赖回调函数

  •  0
  • Nico Müller  · 技术社区  · 8 年前

    我对地狱还很陌生(但我现在越来越明白它的意思了)

    设置:

    • getUserID:具有访问权限令牌,从api获取用户ID
    • getUserDetails:使用userID从api获取userdetails
    • posturedUserDetails:将retrieveduserdetails发布到api

    我需要将值传递给调用:

    代币 ->getUserID(令牌) ->获取用户详细信息(userID) 用户详细信息 ->姿势详细信息(用户详细信息)

    在我出生的时候,我想我可以得到一些东西,比如:

    postUserDetails(getUserDetails(getUserID(getAccessToken())));
    

    或者反过来(我需要更改命名约定,但我尝试了太多,最后陷入了下面的问题中)

    getAccessToken(getUserID(getUserDetails(postUserDetails)))
    

    我是否依赖于任何框架(比如async)来让postureDetails(getUserDetails(getUserID(getAccessToken()))工作?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Thomas    8 年前

    我需要在示例getAccessToken->getUserID->getUserDetails->posterdetails中向下传递值我不知道我的问题是否清楚

    是的,是价值观,但不是承诺本身。

    简单的代码模拟:

    //your call chain
    getAccessToken()
      .then(getUserID)
      .then(getUserDetails)
      .then(postUserDetails)
      .then(() => {
        console.log("Done");
      })
    
    //a mock of your code
    
    //a utility to "simulate" the delay of a server call and return a Promise
    function wait(delay) {
      return new Promise(resolve => setTimeout(resolve, delay));
    }
    
    function getAccessToken() {
      console.log("getAccessToken");
      //mock the request to the server
      return wait(Math.random() * 1000+500)
        .then(() => {
          console.log("generating a token");
          return Math.random().toString(36).slice(2)
        });
    }
    
    function getUserID(token) {
      console.log("getUserID(%o)", token);
      //mock the request to the server
      return wait(Math.random() * 1000+500)
        .then(() => {
          console.log("returning userId");
          return "id-1234";
        });
    }
    
    function getUserDetails(userId) {
      console.log("getUserDetails(%o)", userId);
      //mock the request to the server
      return wait(Math.random() * 1000+500)
        .then(() => {
          console.log("returning user");
          return {
            id: userId,
            firstName: "Zaphod",
            lastName: "Beeblebrox"
          }
        });
    }
    
    
    function postUserDetails(user) {
      console.log("postUserDetails(%o)", user);
      return wait(Math.random() * 1000+500)
        .then(() => {
          console.log("userDetails posted");
        });
    }
    .as-console-wrapper{top:0;max-height:100%!important}