вложенные, зависимые функции обратного вызова - PullRequest
0 голосов
/ 31 августа 2018

Я довольно новичок в аду обратного вызова (но теперь я понимаю его значение все больше и больше)

Настройка:

  • getAccessToken: вызов для получения токена доступа от API
  • getUserID: с токеном доступа получить идентификатор пользователя из API
  • getUserDetails: с помощью userID получить userdetails из API
  • postUserDetails: отправка извлечения данных для API

Мне нужно передать значения по вызовам:

getAccessToken токен -> getUserID (токен) userID -> getUserDetails (userID) userDetails -> postUserDetails (userDetails)

в своей наивности я думал, что смогу запустить что-то вроде:

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

или наоборот (где мне нужно было бы изменить соглашение об именах, но я так старался, что оказался запутанным в приведенном ниже

getAccessToken(getUserID(getUserDetails(postUserDetails)))

Какова логическая структура, позволяющая получить что-то похожее на приведенное ниже с работающими асинхронными вызовами ajax? Как я могу передать несколько обратных вызовов, которые получают значения из предыдущего вызова?

Полагаюсь ли я на какой-либо фреймворк (например, асинхронный) для получения работающего postUserDetails (getUserDetails (getUserID (getAccessToken ())))?

1 Ответ

0 голосов
/ 31 августа 2018

Мне нужно передать значения по вызовам в примере getAccessToken -> getUserID -> getUserDetails -> postUserDetails Я не знаю, было ли это ясно из моего вопроса

Да, ценности, но не сами обещания.

простой макет вашего кода:

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