保存对变量的异步/等待响应

时间:2018-01-18 17:56:54

标签: javascript ecmascript-6 es6-promise

我正在尝试使用async / await和try / catch来理解异步调用。

在下面的示例中,如何将成功的响应保存到可以在其余代码中使用的变量中?

const axios = require('axios');
const users = 'http://localhost:3000/users';

const asyncExample = async () =>{
    try {
        const data = await axios(users);
        console.log(data); //200
    }
    catch (err) {
        console.log(err);
    }
};

//Save response on a variable
const globalData = asyncExample(); 
console.log(globalData) //Promise { <pending> }

5 个答案:

答案 0 :(得分:10)

1)从asyncExample函数

返回一些内容
const asyncExample = async () => {
  return await axios(users)
};

2)调用该函数并处理其返回的Promise

asyncExample().then(users => {
  console.log(users)
})
.catch(err => console.error(err))

你为什么要这样处理呢?

  • 您无法执行顶级await(虽然a proposal也是如此) - await必须存在于async函数中。

  • 将某个功能标记为async会使其返回Promise。您可以在顶层处理Promise,就像我上面那样。

答案 1 :(得分:0)

try..catch创建一个新的块范围。使用letdata之前定义try..catch,而不是来自const函数调用的returndata asyncExample

(async() => {

  const users = 123;

  const asyncExample = async() => {
    let data;
    try {
      data = await Promise.resolve(users);
    } catch (err) {
      console.log(err);
    }
    return data;
  };

  //Save response on a variable
  const globalData = await asyncExample();
  console.log(globalData);
  // return globalData;
})();

答案 2 :(得分:0)

我与您有相同的问题,并找到了这篇文章。经过2天的尝试,我终于找到了一个简单的解决方案。
根据{{​​3}},async函数将仅返回Promise对象而不是值。要访问Promise的响应,必须使用.then()方法或await才能返回Promise的结果对象,而不是Promise本身。
要从await更改变量,您可以访问并更改要在异步函数中分配的变量,而不是从异步函数中返回。

//Save response on a variable
var globalData;
const asyncExample = async () =>{
    try {
        const data = await axios(users);
        globalData = data; // this will change globalData
        console.log(data); //200
    }
    catch (err) {
        console.log(err);
    }
};
asyncExample();

但是,如果执行此操作,则可能会得到未定义的输出。

asyncExample();
console.log(globalData) //undefined

由于asyncExample()async函数,因此当调用console.logasyncExample()尚未完成,因此globalData仍未分配。完成console.log之后,以下代码将调用asyncExample()

const show = async () => {
    await asyncExample();
    console.log(globalData);
}
show();

答案 3 :(得分:-2)

因为事件是异步发生的,所以你需要绑定一个回调/保证。我将假设它返回一个承诺。

const axios = require('axios');
const users = 'http://localhost:3000/users';

const asyncExample = async () =>{
    try {
        const data = await axios(users);
        console.log(data); //200
    }
    catch (err) {
        console.log(err);
    }
};

//Save response on a variable
const globalData = asyncExample().then( (success, err) => {
  if (err) { console.error(err); }
  console.log(success)
}

答案 4 :(得分:-2)

只需使用回调/承诺(级联编程):

colors <- c("Red","Blue","Green")

dfsummaryall <- lapply(colors, function(x){dftmp <- df %>%
dplyr::filter(Color == x) %>% group_by(Code) %>% 
summarise(x == sum(MktValue)