异步/等待返回结果不保证

时间:2019-06-04 14:41:38

标签: javascript async-await

我对异步/等待非常困惑。我一直在阅读有关s / o的答案,但我不明白async / await是否确实满足我的要求。

我正在尝试以同步方式返回异步调用的结果,也许这就是为什么我失败了,也许不是因为这个原因吗?我不想返回一个回调(或Promise),而是返回一个结果。

这就是我一直在尝试的事情

 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中解析诺言,然后在get中使用await会做到这一点?

4 个答案:

答案 0 :(得分:1)

fetch()已经返回了一个承诺,因此没有理由将其包装在另一个承诺中。

 _load(){ return fetch('https://jsonplaceholder.typicode.com/todos/1')}

答案 1 :(得分:0)

  

我正在尝试以同步方式返回异步调用的结果

那是不可能的。异步函数同步返回的唯一内容是一个promise(所有异步函数根据设计都返回promise)。异步函数使使用Promise的语法更加容易,但是它们仍然是异步的。

当您在异步函数中使用await时,这将延迟返回的诺言解析所需的时间。这很好:如果有任何代码正在等待该诺言,它将等待更长的时间,因此将推迟直到您的异步功能完全完成。但是等待诺言不是自动的。您要么需要使用promise的.then方法,要么需要在await函数中使用async关键字。

let resPromise = myTest.get();
resPromise.then(res => console.log(res));
async someFunction() {
  const res = await myTest.get();
  console.log(res);
}

答案 2 :(得分:-1)

我们可以通过在全局自调用功能中指定异步来尝试此操作,

(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);
})();

答案 3 :(得分:-2)

您可以通过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);将返回解析的值。