Javascript异步功能基本

时间:2017-12-31 23:24:38

标签: javascript asynchronous

首先,我是async函数的新手。这段代码中的问题在哪里?我只是输出了test 1test 2

let isAvailable = false;

console.log('test1');

let asynchFunc = () => {
   return new Promise(() => {
       if (isAvailable === true) {
           console.log('here asyncFunc');
       }
   });
}

(async () => {
   await asynchFunc();
});

console.log('test2');

isAvailable = true;

4 个答案:

答案 0 :(得分:0)

你的意思是像这样调用异步函数吗?

(async () => {
   await asynchFunc();
})();

(注意最后添加的()

我不确定您在此尝试测试的内容,异步功能仍会看到false值。您可以通过将您的功能更改为:

来查看
let asynchFunc = () => {
   return new Promise(() => {
         console.log('check isavailable:', isAvailable);
   });
}

如果您只是在寻找可以让您使用异步功能的设置,那么您可以使用以下代码:

const sleep = (time) => new Promise((resolve) => setTimeout(resolve, time));

let isAvailable = false;

(async () => {
  console.log('isAvailable:', isAvailable);
  await sleep(1000);
  console.log('isAvailable:', isAvailable);
})();

console.log('test2');

isAvailable = true;

请注意,使用像这样的睡眠功能等待某些东西可用是完全错误的做事方式。你永远不应该有一个isAvailable标志,这个值应该只是一个可以解决的承诺。你来自哪种语言?你的实际问题是什么?我们可以帮助您更好地解决现实问题。

答案 1 :(得分:0)

let isAvailable = false;

console.log('test1');

let asyncFunc = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (isAvailable === true) {
        resolve('here asyncFunc');
      }
    }, 2000);
  });
}

(async() => {
  return await asyncFunc(); // await used here is optional
})().then(v => {
  console.log(v);  // prints value after 2 seconds.
});

console.log('test2');
isAvailable = true;

所有Promises都需要解决或拒绝。在你的情况下,你没有。为了查看异步函数中的值,我将值传递给resolve回调。

  

在异步函数中,返回值时可以使用await键,因为async function的返回值隐式包含在Promise.resolve中。

答案 2 :(得分:0)

这是一个你可以玩的功能,可以帮助你理解更多的东西。请注意,您正在使用立即调用的函数表达式(IIFE)从同步代码切换到异步代码,只要您了解原始代码中的console.log('test2')可能无法以与您的处理顺序相同的顺序进行处理,这很好。代码看起来可能。但是,你没有调用IIFE,所以只需在它的末尾添加()即可。

即,

(function (){})();
(()=>{})();
(async function(){})();
(async ()=>{})();

至于你的其余代码,你不能解决或拒绝你的承诺,从函数中正确地返回promise,你需要尝试{} catch {}你的异步函数,否则拒绝()承诺将无法处理。

(function(){      
    let isAvailable = false;
    let asynchFunc = () => new Promise((resolve,reject) => {
        if (isAvailable === true) {
            console.log('Available');
            resolve(true);
        }else{
            console.log('Not available');
            reject(false)
        }
    });
    (async () => {
        try{
            // isAvailable = true; // test with me.
            console.log('test1');
            // result is always true, unless there is an error.
            // but if there is an error 
            // the rejected promise will go to catch(e){}.
            let result = await asynchFunc(); 
            console.log('test2');
            isAvailable = true;
        }catch(e){
            console.log('Error:',e)
        }
    })();  
})();

答案 3 :(得分:0)

我不知道我是否以更好的方式说出来:

如果您在承诺中添加timeout,则会在到达此变量的检查之前执行isAvailable = true指令,否则isAvailable将保留false

您可以测试以下两种情况

没有超时



let isAvailable = false;

console.log('test1');

let asynchFunc = () => {
  return new Promise((resolve, reject) => {
    if (isAvailable === true) {
      console.log('here asyncFunc');
      resolve('has been available');
    } else {
      reject('still not available')
    }
  });
}

(async () => {
  try {
    let res = await asynchFunc();
    console.log(res);
  } catch (e) {
    console.log(e);
  }
})();

console.log('test2');

isAvailable = true;




超时



let isAvailable = false;

console.log('test1');


let asynchFunc = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (isAvailable === true) {
        console.log('here asyncFunc');
        resolve('has been available');
      } else {
        reject('still not available')
      }
    }, 2000);
  });
}

(async () => {
  try {
    let res = await asynchFunc();
    console.log(res);
  } catch (e) {
    console.log(e);
  }
})();

console.log('test2');

isAvailable = true;