用promise的解析数据更改变量的值

时间:2019-06-11 09:37:50

标签: javascript promise

如何在data内更改asyncCall()的值并将其设置为诺言的解析值b

我想要的是asyncCall()将返回b。 但是发生的事情是asyncCall()返回了Promise对象。

function resolveAfter2Seconds(data) {
  return new Promise(resolve => {
    resolve(data);
  });
}

async function asyncCall() {
  let data = "a";
  var result = await resolveAfter2Seconds("b");
  data = result;
  return data;
}

asyncCall();

5 个答案:

答案 0 :(得分:3)

使用IIFE

  

使函数异步将自动使其返回一个Promise。您要么必须等待它,要么使用.then来访问解析的值。 IIFE代表“立即调用函数表达式” – Tim VN

function resolveAfter2Seconds(data) {
  return new Promise(resolve => {
    resolve(data);
  });
}

async function asyncCall() {
  let data = "a";
  var result = await resolveAfter2Seconds("b");
  data = result;
  return data;
}

(async function() {
  console.log(await asyncCall())
})()

答案 1 :(得分:1)

异步函数将始终返回Promise(请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#Return_value)。

如果将console.log(result)语句放在asyncCall()函数主体中,您将意识到该值实际上已在此处解析,并且可以按预期使用。但是,正如所记录的那样,异步函数的返回值将始终是“承诺的”,因此您也必须“等待”该函数调用。

要在最高(全局)级别上执行此操作,可以使用IIFE(立即调用函数表达式):

(async () => console.log(await asyncCall()))();

或使用Promise.then()退回到经典的回调函数:

asyncCall().then(value => console.log(value));

某些浏览器还支持顶层等待表达式:

await asyncCall();

答案 2 :(得分:0)

带有异步的

声明函数将返回经典的Promise。 因此您必须使用回调或等待。

异步函数asyncCall()将返回Promise而不是您想要的结果。

asyncCall().then((data) => console.log('in data is your result'));

答案 3 :(得分:0)

异步功能 本身返回承诺

function resolveAfter2Seconds(data) {
  return new Promise(resolve => {
    return resolve(data);
  });
}

async function asyncCall() {
  const result = await resolveAfter2Seconds("b");
  return result;
}

asyncCall().then(
  data => console.log(data)
);

答案 4 :(得分:0)

您必须使用await来从async函数获得结果,但是不能在await函数之外使用async,因此必须包装在async函数中。

或者您也可以使用.then()在其回调中获取结果。

function resolveAfter2Seconds(data) {
  return new Promise(resolve => {
    resolve(data);
  });
}

async function asyncCall() {
  let data = "a";
  var result = await resolveAfter2Seconds("b");
  data = result;
  return data;
}

// Approach 1: wrap it in an async fintion
(async ()=>{
  console.log('result:', await asyncCall());
})();

// Apprach 2: Use then
asyncCall().then(result => console.log('result:', result));