Async / Await возвращающий результат не обещает - PullRequest
2 голосов
/ 04 июня 2019

Я очень запутался с async / await. Я читаю ответы по s / o, но я не понимаю, действительно ли async / await выполняет то, что я хочу.

Я пытаюсь вернуть результат асинхронного вызова синхронно, и, может быть, поэтому я терплю неудачу, может, это не для этого? Я не хочу возвращать обратный вызов (или обещание), но результат одного.

Вот что я пытался сделать

 let namespace = {};

 namespace.Test = class{

      constructor(){

      }        


      async get(){
           let response = await this._load();       
           let data = await response;
           console.log(data); //Logs my data but return Promise instead
           return data;  
      }

     _load(){
         let promise = new Promise((resolve, reject) => {       
             fetch('https://jsonplaceholder.typicode.com/todos/1')
            .then(function(response){
                resolve(response.json());                
            }).catch(error =>  reject(error));           
         });
         return promise;
     }

  }


  //The goal is to figure out if I can have that
  let myTest = new namespace.Test();
  //Here I want data NOT a promise
  let res = myTest.get();

  console.log(res); //logs a Promise but I want what has been resolved instead

Я думал, что решение обещания внутри _load и затем использование await внутри get сделает это?

Ответы [ 4 ]

1 голос
/ 04 июня 2019

поскольку fetch() уже возвращает обещание, нет смысла заключать его в другое обещание.

 _load(){ return fetch('https://jsonplaceholder.typicode.com/todos/1')}
0 голосов
/ 04 июня 2019

Мы можем попробовать это, указав async в Self, вызывающем функцию глобально,

(async function() {
let namespace2 = {};

 namespace2.Test = class{

      constructor(){

      }        


      async get(){
           let response = await this._load();       
           let data = await response;
           console.log(data); //Logs my data but return Promise instead
           return data;  
      }

     _load(){
         let promise = new Promise((resolve, reject) => {       
             fetch('https://jsonplaceholder.typicode.com/todos/1')
            .then(function(response){
                resolve(response.json());                
            }).catch(error =>  reject(error));           
         });
         return promise;
     }

  }



  //The goal is to figure out if I can have that
  let myTest2 = new namespace2.Test();
  //Here I want data NOT a promise
  let res2 = await myTest2.get();

  console.log(res2);
})();
0 голосов
/ 04 июня 2019

Вы можете сделать это с помощью await (см. https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/await)

Итак, вы просто пишете:

//Here I want data NOT a promise
let res = await myTest.get();

И console.log(res); теперь будут возвращать разрешенное значение.

0 голосов
/ 04 июня 2019

Я пытаюсь вернуть результат асинхронного вызова синхронно

Это невозможно. Единственное, что синхронно возвращается асинхронной функцией, - это обещание (все асинхронные функции возвращают обещания по своему замыслу). Асинхронные функции упрощают синтаксис для работы с обещаниями, но они все еще асинхронны.

Когда вы используете await внутри своей асинхронной функции, это задержит время, необходимое для разрешения возвращенного обещания. Это хорошо: если какой-либо код ожидает этого обещания, он будет ждать дольше и, таким образом, будет задерживаться, пока ваша асинхронная функция не будет полностью выполнена. Но ожидание обещания не является автоматическим; вам нужно либо использовать метод обещания .then, либо использовать ключевое слово await внутри функции async.

let resPromise = myTest.get();
resPromise.then(res => console.log(res));
async someFunction() {
  const res = await myTest.get();
  console.log(res);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...