Javascript jsasync(async/await)返回承诺,但也执行函数

Javascript jsasync(async/await)返回承诺,但也执行函数,javascript,node.js,async-await,Javascript,Node.js,Async Await,JavaScript异步函数返回承诺,但也执行该函数。这有点违背了目的。请解释一下。还有一种方法可以通过仅使用async/await(非promise)返回承诺而不执行 函数等待(毫秒){ var start=new Date().getTime(); var结束=开始; 同时(结束{ console.log(“开始fn”,值) 等待(2000年); console.log(“结束fn”,值) 返回值; } 常量main=async()=>{ var promiseForFn=fn(3); 日

JavaScript异步函数返回承诺,但也执行该函数。这有点违背了目的。请解释一下。还有一种方法可以通过仅使用async/await(非promise)返回承诺而不执行

函数等待(毫秒){
var start=new Date().getTime();
var结束=开始;
同时(结束<开始+毫秒){
end=新日期().getTime();
}
}
常数fn=async(值)=>{
console.log(“开始fn”,值)
等待(2000年);
console.log(“结束fn”,值)
返回值;
}
常量main=async()=>{
var promiseForFn=fn(3);
日志(“promiseForFn”,promiseForFn);
var值=等待承诺fn;
console.log(“值”,value);
}
main()

const wait=async(ms)=>{
var start=new Date().getTime();
var结束=开始;
同时(结束<开始+毫秒){
end=新日期().getTime();
}
}
常数fn=async(值)=>{
console.log(“开始fn”,值)
等待等待(2000年);
console.log(“结束fn”,值)
返回值;
}
常量main=async()=>{
var promiseForFn=fn(3);
日志(“promiseForFn”,promiseForFn);
var值=等待承诺fn;
console.log(“值”,value);
}
main()
答案是,将函数标记为
async
并不是使其真正异步的原因。多亏了另一个人


async关键字只能用于在代码块中使用wait的函数。在您的情况下,“wait”函数是同步的(并阻止事件循环),因此不需要使用async字。

async关键字应仅用于代码块中使用wait的函数。在您的情况下,“wait”函数是同步的(并阻止事件循环),因此不需要异步字。

  • 有许多方法可以实现代码的异步性。回调、内置函数(如
    setTimeout
    )和
    Promises
    是一些常见的函数
  • 将函数标记为
    async
    并不是使其真正异步的原因。它允许您在希望等待承诺的地方使用关键字
    wait
  • 是的,
    await/async
    只能与
    Promise
    一起使用。它们对于以命令式(sync)样式表示应用于异步代码的分支和更复杂的流控制非常有用
尝试以下代码,看看它是如何工作的,希望对您有所帮助:


  • 有许多方法可以实现代码的异步性。回调、内置函数(如
    setTimeout
    )和
    Promises
    是一些常见的函数
  • 将函数标记为
    async
    并不是使其真正异步的原因。它允许您在希望等待承诺的地方使用关键字
    wait
  • 是的,
    await/async
    只能与
    Promise
    一起使用。它们对于以命令式(sync)样式表示应用于异步代码的分支和更复杂的流控制非常有用
尝试以下代码,看看它是如何工作的,希望对您有所帮助:



您的
wait
功能是同步的。当你从
fn
使用它时,你期望发生什么?@另一个人请帮助我理解。我将wait转换为async。但似乎仍没有如预期那样发挥作用。您的
wait
功能是同步的。当你从
fn
使用它时,你期望发生什么?@另一个人请帮助我理解。我将wait转换为async。但似乎仍没有如预期那样发挥作用。我来自C#world。提到异步会使函数异步。我的错。在链的深处,最终函数不是一直都是同步的吗?这个函数不应该告诉上层的每个人,请不要等我,在我回来之前要有这个承诺。我认为这一承诺将通过前面提到的异步来实现,就像在C#中一样。我会接受答案。
在链的深处,最终函数不是一直都是同步的吗?
是的,它必须是同步的。这就是为什么我要做
dotwoothings()。然后(…)
——我认为不可能在根级别上等待
。至少,我不知道该怎么做…@ravi-在c#中只向函数添加async关键字并不能使任何东西异步。它只允许您在其中使用waitmethod@FredrikLundin. 正确的。返回任务不需要。这就是JS中的承诺。我现在什么都懂了。@Ravi虽然从技术上讲,它们不一定是100%精确的匹配,但我最终使用了几乎相同的心理模型,因为这个模型是a)简单的;b) “足够好”;c) 易于学习(因为这是建立在我已经知道的基础上的)。是的,我也是从.NET领域来到JS/TS的。我来自C#world。提到异步会使函数异步。我的错。在链的深处,最终函数不是一直都是同步的吗?这个函数不应该告诉上层的每个人,请不要等我,在我回来之前要有这个承诺。我认为这一承诺将通过前面提到的异步来实现,就像在C#中一样。我会接受答案。
在链的深处,最终函数不是一直都是同步的吗?
是的,它必须是同步的。这就是为什么我要做
dotwoothings()。然后(…)
——我认为不可能在根级别上等待
。至少,我不知道该怎么做…@ravi-在c#中只向函数添加async关键字并不能使任何东西异步。它只允许您在其中使用waitmethod@FredrikLundin. 正确的。返回任务不需要。这就是JS中的承诺。我现在什么都懂了。@Ravi虽然从技术上讲,它们不一定是100%精确的匹配,但我最终使用了几乎相同的心理模型,因为这个模型是a)简单的;b) “足够好”;c) 易于学习(因为这是建立在我已经知道的基础上的)。是的,我是从.NET领域来到JS/TS的
function wait(ms){
  var start = new Date().getTime();
  var end = start;
  while(end < start + ms) {
    end = new Date().getTime();
  }
}

const fn = async (value) => {
  console.log("start fn ", value)
  wait(2000);
  console.log("end fn ", value)
  return value;
}

const main = async () => {
  var promiseForFn = fn(3);
  console.log("promiseForFn ", promiseForFn);
  var value = await promiseForFn;
  console.log("value ", value);
}

main()
const wait = async(ms) => {
  var start = new Date().getTime();
  var end = start;
  while (end < start + ms) {
    end = new Date().getTime();
  }
}

const fn = async(value) => {
  console.log("start fn ", value)
  await wait(2000);
  console.log("end fn ", value)
  return value;
}

const main = async() => {
  var promiseForFn = fn(3);
  console.log("promiseForFn ", promiseForFn);
  var value = await promiseForFn;
  console.log("value ", value);
}

main()
function wait(ms, text) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('complete', text);
      resolve({});
    }, ms);
  });
};

async function doTwoThings() {    // This func will return a Promise
  await wait(2000, 'BBB');        // - to which you can subscribe with `.then`
  await wait(1000, 'AAA');        // - or `await` on within another `async` function.
  return 'Both done';
}

doTwoThings()
  .then(
     result => console.info('Done done done!', result),
     err => console.error('Oooops', err)
  );