Как дождаться ответа от другого вызова, чтобы создать запрос на повторный вызов

#javascript #node.js #asynchronous #promise #fetch-api

Вопрос:

У меня есть ниже 2 файлов, я хочу убедиться, что вызов в порядке. Я попробовал обещание и обратный вызов, должен признать, что я не на 100% знаком с асинхронными вызовами.

config.js:

 import rolesJson from '../../roles';  class Config{  url; rolesList;  constructor(callback){   var baseurl = 'www.example.com/env';   fetch(baseurl)  .then(response =gt; response.json())  .then(data =gt; {  this.url = data.url;  getAuth(data.env);  }).catch((error) =gt; {   });   const getAuth= (env) =gt; {  const headers = { 'Content-Type': 'application/json' };  const options = { method: 'POST', headers, body:JSON.stringify(rolesJson(env))};  console.log("THIS BODY SHOULD NOT BE UNDEFINED", options.body);  fetch('www.example.com/auth', options)  .then(response =gt; response.json())  .then(data =gt; {   }).catch((error) =gt; {   });  }; }  } module.exports = Config;  

roles.js

 var roleUrl = 'www.example.com/roles';  const setEnviroment = (rolesdata,env) =gt; { let reqBody = {  "environment": env,  "components": rolesdata } console.log("REQUEST BODY CREATED", reqBody); return req; }  const getRoles = (env) =gt; { fetch(roleUrl) .then(response =gt; response.json()) .then(roles =gt; {  let rolesList = [];  roles.map(x =gt; {  const roleObj = {  name: x.name,  id: x.id,  }  rolesList.push(roleObj);  })  return setEnviroment(rolesList, env);  }).catch((error) =gt; {  }); }; module.exports = getRoles;  

Как я могу быть уверен, когда я вызываю fetch(‘www.example.com/auth’, варианты), варианты.тело не является неопределенным? Я пытался использовать асинхронное/ожидание и обратные вызовы, для меня ничего не работает.

Any help will be very appreciated.

Thanks

Ответ №1:

No worries — promises are not easy to get at first. So first of all, you can only rely on the value, if you waited that it was resolved. This can be done, as you already pointed out, with .then or with async / await.

.then-solution:

 var roleUrl = 'www.example.com/roles';  const setEnviroment = (rolesdata,env) =gt; { let reqBody = {  "environment": env,  "components": rolesdata } console.log("REQUEST BODY CREATED", reqBody); return req; }  const getRoles = (env) =gt; { fetch(roleUrl) .then(response =gt; response.json()) .then(roles =gt; {  let rolesList = [];  roles.map(x =gt; {  const roleObj = {  name: x.name,  id: x.id,  }  rolesList.push(roleObj);  })  return setEnviroment(rolesList, env);  });  // we return the promise }; module.exports = getRoles;  
 class Config{  url; rolesList;  constructor(callback){   var baseurl = 'www.example.com/env';   fetch(baseurl)  .then(response =gt; response.json())  .then(data =gt; {  this.url = data.url;  getAuth(data.env);  }).catch((error) =gt; {   });   const getAuth= (env) =gt; {  const headers = { 'Content-Type': 'application/json' };  const options = { method: 'POST', headers, body:JSON.stringify(rolesJson(env))};  console.log("THIS BODY SHOULD NOT BE UNDEFINED", options.body);  fetch('www.example.com/auth', options)  .then(response =gt; response.json());  // we return the Promise  }; }  } module.exports = Config;  
 // calling method  Config.getAuth(env).then((value) =gt; {  return getRoles(env); //this returns a Promise again }).then(x =gt; {  // here you have the return type of getRoles })  

асинхронное ожидание решения:

 var roleUrl = 'www.example.com/roles';  const setEnviroment = (rolesdata,env) =gt; { let reqBody = {  "environment": env,  "components": rolesdata } console.log("REQUEST BODY CREATED", reqBody); return req; }  const getRoles = async (env) =gt; {  let response await fetch(roleUrl); // awaiting fetch promise  let roles = await response.json(); // awaiting .json()-promise  let rolesList = [];  roles.map(x =gt; {  const roleObj = {  name: x.name,  id: x.id,  }  rolesList.push(roleObj);  })  return setEnviroment(rolesList, env);  };  // async always returns a promise  module.exports = getRoles;  
 class Config{  url; rolesList;  constructor(callback){   var baseurl = 'www.example.com/env';   fetch(baseurl)  .then(response =gt; response.json())  .then(data =gt; {  this.url = data.url;  getAuth(data.env);  }).catch((error) =gt; {   });   const getAuth = async (env) =gt; {  const headers = { 'Content-Type': 'application/json' };  const options = { method: 'POST', headers, body:JSON.stringify(rolesJson(env))};  console.log("THIS BODY SHOULD NOT BE UNDEFINED", options.body);  const response = await fetch('www.example.com/auth', options);  const body = await response.json();  return body; // we return a Promise including the body  }; }  } module.exports = Config;  
 // calling method  const callerMethod = async () =gt; {  const auth = await Config.getAuth(env);  const roles = await getRoles(env);  //now you can work with the resolved stuff };  

Пожалуйста, обратите внимание, что callerMethod снова вернет само обещание, потому что оно асинхронно.

Комментарии:

1. Есть ли способ не создавать другой метод, такой как callerMethod? Как переодевание в roles.js или получить доступ в config.js

2. Да, вам это может пригодиться . тогда и … лови там, если хочешь. Вот почему многие разработчики используют асинхронность во всей кодовой базе

3. Я попытался добавить . затем и .поймайте в getAuth, это не работает.. И все это завернуто в конструктор, я не могу включить асинхронность в конструктор..