异步等待节点js

时间:2018-05-14 15:17:28

标签: node.js

我正在学习异步等待使用节点js

var testasync = async () =>
{

const result1 = await returnone();

return result1;
}

testasync().then((name)=>{
    console.log(name);
}).catch((e) =>{
    console.log(e);
});


var returnone = () =>{
    return new Promise((resolve,reject)=>
{
    setTimeout(()=>{
        resolve('1');
    },2000)
})
}

失败,returnone不是函数。我究竟做错了什么?只是单独调用函数

returnone().then((name1) => {
    console.log(name1)
})

只需调用上面的代码

即可

2 个答案:

答案 0 :(得分:1)

您正在将函数分配给代码末尾的变量 returnone ,但是您尝试在此分配之前调用该函数。您有两种方法可以修复代码:

选项1

使用函数声明;这样,函数就会被提升,你可以从一开始就使用它:

var testasync = async () => {
  const result1 = await returnone();  
  return result1;
}

testasync().then((name) => {
  console.log(name);
}).catch((e) => {
  console.log(e);
});

function returnone() {
  return new Promise((resolve,reject) => {
    setTimeout(() => {
      resolve('1');
    }, 2000)
  })
}

选项2

在尝试调用函数之前将函数分配给变量:

var returnone = () => {
  return new Promise((resolve,reject) => {
    setTimeout(() => {
      resolve('1');
    }, 2000)
  })
}

var testasync = async () => {
  const result1 = await returnone();  
  return result1;
}

testasync().then((name) => {
  console.log(name);
}).catch((e) => {
  console.log(e);
});

答案 1 :(得分:1)

由于hoisting而导致此错误的原因。 JS看到的代码看起来像这样

var returnone;
var testasync = async () => {
  const result1 = await returnone();  
  return result1;
}

testasync().then((name) => {
  console.log(name);
}).catch((e) => {
  console.log(e);
});

returnone = () => {
  return new Promise((resolve,reject) => {
    setTimeout(() => {
      resolve('1');
    }, 2000)
  })
}

因此returnone的值未定义。