“一点帮助!”使用javascript中的异步语法。我是个老菜鸟,我发现这让我有点沮丧

“一点帮助!”使用javascript中的异步语法。我是个老菜鸟,我发现这让我有点沮丧,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,我只想运行一个异步函数,让它等待,直到它有一个返回值,将该返回值传递给另一个异步函数,然后清洗并重复几次。我看过一些例子,但我正在努力使它们在测试代码中工作。恕我直言,但我不得不为自己造成的鼻血找点乐子 如果不在附加的代码中传递返回值,我甚至无法让它工作,此时我感觉自己非常愚蠢 whosOnFirst(1) .then(whatsOnSecond(2)) .then(iDunnosOnthird(3)) 我希望看到执行whosOnFirst1的语法,将返回值传递给whatsOnSecond,

我只想运行一个异步函数,让它等待,直到它有一个返回值,将该返回值传递给另一个异步函数,然后清洗并重复几次。我看过一些例子,但我正在努力使它们在测试代码中工作。恕我直言,但我不得不为自己造成的鼻血找点乐子

如果不在附加的代码中传递返回值,我甚至无法让它工作,此时我感觉自己非常愚蠢

whosOnFirst(1)
.then(whatsOnSecond(2))
.then(iDunnosOnthird(3)) 
我希望看到执行whosOnFirst1的语法,将返回值传递给whatsOnSecond,并将其返回值传递给iDunnosOnthird。创建所需的输出减去代码段底部引用的空格

我真的很感谢你的帮助

//具有输入/输出参数的任意定时器,用于异步理解; 函数waitSeccallerName,暂停{// 调用了console.log`${callerName},正在等待${pause}秒` setTimeoutfunction{ console.log`${callerName}在返回中发送了${pause+1},完成了` return pause+1;//延迟返回值/将1添加到输入参数 },暂停*1000; } //谁是第一个-使用输入参数=1首先运行此操作 异步函数whosOnFirsti{ WaitSec谁先上,1.然后结果=>{ 返回结果; } } //完成whosOnFirst使用return for param后的第二次运行是什么 异步函数whatsOnSecondi{ WaitSec秒数是多少,i.thenresult=>{ 返回结果; } } //iDunno在使用参数返回完成whatsOnSecondi后的第三次运行 异步函数iDunnosOnthirdi{ waitSeciDunno在第三,i.thenresult=>{ 返回结果; } } 谁先来 .那么接下来呢 .Thenidunosonthird3 //电流输出: //第一个打电话的是谁,等了1秒钟。。。 //秒叫什么,等2秒。。。 //iDunno打第三个电话,等了3秒钟。。。 //谁先发了2个回音,完成了! //第二次发送的内容返回3,完成! //iDunno在第三次发送4作为回报,完成了! //期望输出: //第一个打电话的是谁,等了1秒钟。。。 //谁先发了2个回音,完成了! //秒叫什么,等2秒。。。 //第二次发送的内容返回3,完成! //iDunno打第三个电话,等了3秒钟。。。
//iDunno在第三次发送4作为回报,完成了 您需要等待这样的结果:

async function main() {
  const result1 = await whosOnFirst(1);
  // whosOnSecond will not get called except after the whosOnFirst is done.
  const result2 = await whosOnSecond(result1);
}

您需要等待这样的结果:

async function main() {
  const result1 = await whosOnFirst(1);
  // whosOnSecond will not get called except after the whosOnFirst is done.
  const result2 = await whosOnSecond(result1);
}
对于异步函数,请使用美观的wait关键字。waitSec函数应该返回一个承诺,而且当您解析承诺时,您的值也会出现。thenres=>console.logres,使用它进行链接,如下所示:

//具有输入/输出参数的任意定时器,用于异步理解; 函数waitSeccallerName,暂停{// 返回新的PromiseSolve,拒绝=>{ 调用了console.log`${callerName},正在等待${pause}秒` setTimeoutfunction{ console.log`${callerName}在返回中发送了${pause+1},完成了` resolvepause+1;//延迟返回值/将1添加到输入参数 },暂停*1000; } } //谁是第一个-使用输入参数=1首先运行此操作 异步函数whosOnFirsti{ const resp=等待等待等待谁在第一位,1; 返回响应; } //完成whosOnFirst使用return for param后的第二次运行是什么 异步函数whatsOnSecondi{ const resp=等待等待秒,i; 返回响应; } //iDunno在使用参数返回完成whatsOnSecondi后的第三次运行 异步函数iDunnosOnthirdi{ const resp=等待第三个,i上的Waitseciduno; 返回响应; } whosOnFirst1.thenfirstResp=>{ whatsOnSecondfirstResp.thensecResp=>{ iDunnosOnthirdsecResp.thenthirdResp=>{ console.logthirdResp; } } } 对于异步函数,请使用美观的wait关键字。waitSec函数应该返回一个承诺,而且当您解析承诺时,您的值也会出现。thenres=>console.logres,使用它进行链接,如下所示:

//具有输入/输出参数的任意定时器,用于异步理解; 函数waitSeccallerName,暂停{// 返回新的PromiseSolve,拒绝=>{ 调用了console.log`${callerName},正在等待${pause}秒` setTimeoutfunction{ console.log`${callerName}在返回中发送了${pause+1},完成了` resolvepause+1;//延迟返回值/将1添加到输入参数 },暂停*1000; } } //谁是第一个-使用输入参数=1首先运行此操作 异步函数whosOnFirsti{ const resp=等待等待等待谁在第一位,1; 返回响应; } //完成whosOnFirst使用return for param后的第二次运行是什么 异步函数whatsOnSecondi{ const resp=等待等待秒,i; 返回响应; } //iDunno在whatsOn完成后第三次运行 Secondi使用参数返回 异步函数iDunnosOnthirdi{ const resp=等待第三个,i上的Waitseciduno; 返回响应; } whosOnFirst1.thenfirstResp=>{ whatsOnSecondfirstResp.thensecResp=>{ iDunnosOnthirdsecResp.thenthirdResp=>{ console.logthirdResp; } }
} 下面是它的工作原理:

函数延迟毫秒{ 返回新PromiseSolve=>{ 设置超时=>{ 决定 },毫秒; }; } 异步功能测试{ console.log“还没有延迟”; 等待1000; 控制台。记录“1秒后”; 等待1000; 控制台。日志“已过2秒”; 等待3000; 控制台。记录‘哦,看,5秒钟过去了!’; }
试验 下面是它的工作原理:

函数延迟毫秒{ 返回新PromiseSolve=>{ 设置超时=>{ 决定 },毫秒; }; } 异步功能测试{ console.log“还没有延迟”; 等待1000; 控制台。记录“1秒后”; 等待1000; 控制台。日志“已过2秒”; 等待3000; 控制台。记录‘哦,看,5秒钟过去了!’; } 测验工作溶液 您的问题是waitSec与代码的其余部分处于不同的上下文中。你需要把它提升到承诺的上下文中

然后,您就一直拥有promisified代码,并且可以链接承诺。下面是进一步的解释:

//具有输入/输出参数的任意定时器,用于异步理解; 函数waitSeccallerName,暂停{// 返回新PromiseSolve=>{ 调用了console.log`${callerName},正在等待${pause}秒` setTimeoutfunction{ console.log`${callerName}在返回中发送了${pause+1},完成了` resolvepause+1;//延迟返回值/将1添加到输入参数 },暂停*1000; } } //谁是第一个-使用输入参数=1首先运行此操作 函数whosOnFirsti{ 返回WaitSec谁在第一,1 } //完成whosOnFirst使用return for param后的第二次运行是什么 函数whatsOnSecondi{ 返回服务员第二排是什么 } //iDunno在使用参数返回完成whatsOnSecondi后的第三次运行 函数iDunnosOnthirdi{ 返回第三个waitSeciDunno's,i } 谁先来 .然后是什么秒 .Thenidunosonthird .thenconsole.logWorking解决方案 您的问题是waitSec与代码的其余部分处于不同的上下文中。你需要把它提升到承诺的上下文中

然后,您就一直拥有promisified代码,并且可以链接承诺。下面是进一步的解释:

//具有输入/输出参数的任意定时器,用于异步理解; 函数waitSeccallerName,暂停{// 返回新PromiseSolve=>{ 调用了console.log`${callerName},正在等待${pause}秒` setTimeoutfunction{ console.log`${callerName}在返回中发送了${pause+1},完成了` resolvepause+1;//延迟返回值/将1添加到输入参数 },暂停*1000; } } //谁是第一个-使用输入参数=1首先运行此操作 函数whosOnFirsti{ 返回WaitSec谁在第一,1 } //完成whosOnFirst使用return for param后的第二次运行是什么 函数whatsOnSecondi{ 返回服务员第二排是什么 } //iDunno在使用参数返回完成whatsOnSecondi后的第三次运行 函数iDunnosOnthirdi{ 返回第三个waitSeciDunno's,i } 谁先来 .然后是什么秒 .Thenidunosonthird
.thenconsole.log您正在立即执行回调函数。您需要类似的东西。然后=>whatsOnSecond2a如果您不使用Wait b,则不要使用异步函数语法。然后…需要回调函数-将调用包装在函数表达式中c您的函数需要返回它们正在构建的承诺链d您的waitSec函数。看一看,waitSec也应该回复一个承诺。例如returnnewpromiseres=>setTimeoutres,pause*1000,pause+1这里没有正确使用评论,但我只想对大家说声谢谢!。我感谢大家花时间来减少我的无知……您正在立即执行回调函数。您需要类似的东西。然后=>whatsOnSecond2a如果您不使用Wait b,则不要使用异步函数语法。然后…需要回调函数-将调用包装在函数表达式中c您的函数需要返回它们正在构建的承诺链d您的waitSec函数。看一看,waitSec也应该回复一个承诺。例如returnnewpromiseres=>setTimeoutres,pause*1000,pause+1这里没有正确使用评论,但我只想对大家说声谢谢!。我很感激每个人都花时间试图降低我的无知程度……我重新检查了我的答案,我认为没有那么糟糕,有人能告诉我为什么会投反对票吗?我不知道为什么人们会投你的反对票,但事实上你的链接也是首选的,投了你的赞成票。我重新检查了我的答案,我不认为
有那么糟糕,有人能告诉我为什么投反对票吗?我不知道为什么人们会投你反对票,但你的锁链实际上也是首选,投了你一票。嗨,乔希!这是一个远远超过和超越后IMHO。感谢您提供的所有示例,我将使用此作为参考,因为我需要一段时间才能以这种方式可视化程序流。嗨,Josh!这是一个远远超过和超越后IMHO。感谢您提供的所有示例,我将使用它作为参考,因为在我以这种方式可视化程序流之前需要一段时间。