当前位置: 首页 > news >正文

绍兴网站建设电话爱站网seo综合查询

绍兴网站建设电话,爱站网seo综合查询,微平台是什么,wordpress文章显示摘要这篇文章想讲一下JavaScript中同步与异步操作在一个简单的示例中的应用。我们将以制作汉堡为例,展示如何使用同步方法、回调函数(callbacks)和Promise与async/await来实现该过程。 Let’s imagine we’re trying to make a burger: 1. Get …

这篇文章想讲一下JavaScript中同步与异步操作在一个简单的示例中的应用。我们将以制作汉堡为例,展示如何使用同步方法、回调函数(callbacks)和Promise与async/await来实现该过程。

Let’s imagine we’re trying to make a burger:

1. Get ingredients 获取原料(比如beef)

2. Cook the beef  烹饪牛肉

3. Get burger buns 获得面包片

4. Put the cooked beef between the buns 把做好的牛肉放进面包片

5. Serve the burger 提供burger

接下来我们用不同方法来演示这几个步骤的实现。

1. 同步方法

首先,我们来看一个使用同步方法实现汉堡制作过程的示例:

function getBeef() {console.log("Step 1: Getting beef");return "beef";
}function cookBeef(beef) {console.log("Step 2: Cooking beef");if (beef === "beef") return "patty";
}function getBuns() {console.log("Step 3: Getting buns");return "buns";
}function putBeefBetweenBuns(buns, patty){if (buns === "buns" && patty === "patty") {console.log("Step 4: Putting beef patty between buns");return "burger"}
}function makeBurger() {const beef = getBeef();const patty = cookBeef(beef);const buns = getBuns();const burger = putBeefBetweenBuns(buns, patty);return burger;
}function serve(burger){console.log("Finally: " + burger + " is served!")
}const burger = makeBurger();
serve(burger);

在这个示例中,我们使用了同步方法来实现汉堡制作的各个步骤。这种方法非常简单,没什么可以讲的,但在处理复杂任务时可能会受限,因为它不支持异步操作。

2. 回调函数(Callbacks)

接下来,我们来看一个使用回调函数实现汉堡制作过程的示例:

function getBeef(cb) {setTimeout(() => {console.log("Step 1: Getting beef");const beef = "beef";cb(beef);}, 1000);
}function cookBeef(beef, cb) {setTimeout(() => {if(beef === "beef"){console.log("Step 2: Cooking beef");const patty = "patty"cb(patty)}}, 1000)
}function getBuns(cb) {setTimeout(() => {console.log("Step 3: Getting buns");const buns = "buns";cb(buns)}, 1000)
}    function putBeefBetweenBuns(buns, patty, cb) {setTimeout(() => {if (buns === "buns" && patty === "patty") {console.log("Step 4: Putting beef patty between buns");const burger = "burger"cb(burger)}}, 1000);
}//关键部分
function makeBurger(cb) {getBeef(function(beef) {cookBeef(beef, function(patty)getBuns(function(buns) {putBeefBetweenBuns(buns, patty, function(burger) {cb(burger);});});});
});
}function serve(burger){
console.log("Finally: Burger is served!")
}// Make and serve the burger
makeBurger((burger) => {
serve(burger)
})

为了理解上面的例子,先说一下 setTimeout  函数,setTimeout 是一个 JavaScript 函数,它用于在指定的时间延迟后执行某个函数或代码片段。setTimeout 本身不会阻塞代码执行,它会将提供的回调函数(需要延迟执行的代码)放入一个队列中,在计时器结束后将其放入事件循环,等待执行。让我给你一个简单的例子来解释 setTimeout 的工作原理:

console.log("Before setTimeout");setTimeout(() => {console.log("Inside setTimeout");
}, 2000);console.log("After setTimeout");

执行这段代码时,你会发现输出顺序如下:

Before setTimeout
After setTimeout
大约 2 秒后,会出现:Inside setTimeout

在第二个制作汉堡的示例中,我们使用回调函数来处理异步操作。

回调函数就是一个作为参数传递给另一个函数的函数。当被调用函数完成其操作后,它会执行传递的回调函数。在这个汉堡制作示例中,我们将回调函数用于每个步骤的完成通知。

下面是回调函数示例的详细解释:

  1. makeBurger() 函数被调用,它首先调用 getBeef() 函数,并将一个匿名回调函数作为参数传递。这个回调函数接收一个参数 beef
  2. getBeef() 函数执行异步操作(使用 setTimeout() 模拟),当操作完成后,它调用传递的回调函数,并将 beef 作为参数传递。
  3. 回调函数执行,并使用 beef 参数调用 cookBeef() 函数。同样,我们为 cookBeef() 函数传递一个匿名回调函数,接收一个参数 patty
  4. cookBeef() 函数执行异步操作,当操作完成后,它调用传递的回调函数,并将 patty 作为参数传递。
  5. 回调函数执行,并使用 patty 参数调用 getBuns() 函数。我们为 getBuns() 函数传递一个匿名回调函数,接收一个参数 buns
  6. getBuns() 函数执行异步操作,当操作完成后,它调用传递的回调函数,并将 buns 作为参数传递。
  7. 回调函数执行,并使用 bunspatty 参数调用 putBeefBetweenBuns() 函数。我们为 putBeefBetweenBuns() 函数传递一个匿名回调函数,接收一个参数 burger
  8. putBeefBetweenBuns() 函数执行异步操作,当操作完成后,它调用传递的回调函数,并将 burger 作为参数传递。
  9. 回调函数执行,并将 burger 参数传递给 serve() 函数。
  10. serve() 函数打印消息,表明汉堡已经制作完成并上菜。

在这个过程中,我们可以看到回调函数在每个异步操作完成后执行,并将结果传递给下一个操作。这使我们能够以异步方式处理整个汉堡制作过程。然而,这种方法的缺点是回调函数可能导致嵌套层数过多,导致代码可读性降低。甚至不仔细看很久都看不懂的程度,所以别担心如果你看不懂这个代码,JavaScript本身语法和可读性可理解性我觉得就是垃圾至极,看不懂别有心理负担,反正我们要避免类似上面的这种Callback Hell, 我们最常用的也是下面的这种方法:

3. Promise 与 async/await

function getBeef() {return new Promise((res) => {setTimeout(() => {console.log("Step 1: Getting beef");res("beef");}, 1000);});
}function cookBeef(beef) {return new Promise((res, rej) => {setTimeout(() => {if (beef === "beef"){console.log("Step 2: Cooking beef");res("patty");}else rej("no beef available");}, 1000);});
}function getBuns() {return new Promise((res) => {setTimeout(() => {console.log("Step 3: Getting buns");res("buns");}, 1000);});
}function putBeefBetweenBuns(buns, patty) {return new Promise((res, rej) => {setTimeout(() => {if (buns !== "buns") rej("no buns");else if (patty !== "patty") rej("no patty");else{console.log("Step 4: Putting beef patty between buns");res("burger");}    }, 1000);});
}//Promise链式调用
getBeef().then(beef => {return Promise.all([cookBeef(beef),getBuns()])
}).then(ingredients => {const [patty, buns] = ingredients;return putBeefBetweenBuns(buns, patty)
}).then(burger => {console.log("Finally: " + burger + " is served!")
})//async/await
async function makeBurger(){const beef = await getBeef();const patty = await cookBeef(beef);const buns = await getBuns();const burger = await putBeefBetweenBuns(buns, patty);return burger
}
makeBurger()

在这个示例中,我们使用了Promise的链式调用(用then关键字)以及async/await来处理异步操作。

1.对于Promise链式调用,通过 .then() 方法将异步操作链接在一起。在这个例子中,首先调用 getBeef(),然后在 .then() 中处理获得的 beef。接着,我们使用 Promise.all()cookBeef(beef)getBuns() 一起执行,等待它们都完成后,再处理它们的结果。最后,我们将 pattybuns 放在一起组成 burger。这种写法的优点是:它允许你以更加清晰的方式组织异步操作。但是,当异步操作非常多时,这种写法可能导致 .then() 链过长,从而使代码变得难以阅读和维护。

2.对于async/await,它允许你以更接近同步代码的方式编写异步操作。在这个例子中,我们使用 await 等待每个异步操作完成,并将结果赋值给相应的变量。这样,代码看起来就像是同步执行的,但实际上仍然是异步的。这种写法的优点是:它使代码更加简洁和易于阅读。此外,它可以让你更容易地处理错误,因为你可以直接使用 try-catch 语句捕获异步操作中的异常。

这两种写法都用于处理异步操作,它们的主要区别在于书写风格和可读性。Promise 链式调用更注重将操作链接在一起,而 async/await 更侧重于使代码看起来像同步执行。

总结

在这篇博客中,我们比较了在JavaScript中实现同步和异步操作的三种方法:同步方法、异步中的回调函数和Promise链式调用与async/await。每种方法都有其优缺点。同步方法易于理解,但不支持异步操作;回调函数支持异步操作,但可读性差;而Promise与async/await既支持异步操作,又具有良好的可读性,因此更推荐这两种写法。


文章转载自:
http://dinncosyntax.wbqt.cn
http://dinncotew.wbqt.cn
http://dinncocountertide.wbqt.cn
http://dinncomuckle.wbqt.cn
http://dinncoinventroy.wbqt.cn
http://dinncodekaliter.wbqt.cn
http://dinncogrossularite.wbqt.cn
http://dinncorojak.wbqt.cn
http://dinncoimpiety.wbqt.cn
http://dinncoangeleno.wbqt.cn
http://dinncorussellite.wbqt.cn
http://dinncovinylbenzene.wbqt.cn
http://dinncowftu.wbqt.cn
http://dinncoamnioscopy.wbqt.cn
http://dinncooutclearing.wbqt.cn
http://dinncostir.wbqt.cn
http://dinncocuckoo.wbqt.cn
http://dinncocovalency.wbqt.cn
http://dinncoreptilarium.wbqt.cn
http://dinncofictional.wbqt.cn
http://dinncoreckless.wbqt.cn
http://dinncoamsterdam.wbqt.cn
http://dinncodyslogy.wbqt.cn
http://dinncogilbertese.wbqt.cn
http://dinncomegagamete.wbqt.cn
http://dinncotuppence.wbqt.cn
http://dinncoenergetically.wbqt.cn
http://dinncospeechreading.wbqt.cn
http://dinncophototypesetting.wbqt.cn
http://dinncohourglass.wbqt.cn
http://dinncomucous.wbqt.cn
http://dinncoinniskilling.wbqt.cn
http://dinncourologic.wbqt.cn
http://dinncotransitoriness.wbqt.cn
http://dinncosecateur.wbqt.cn
http://dinncosonorization.wbqt.cn
http://dinncoatomistics.wbqt.cn
http://dinncochinky.wbqt.cn
http://dinncocolewort.wbqt.cn
http://dinncosphingid.wbqt.cn
http://dinncoionization.wbqt.cn
http://dinncotee.wbqt.cn
http://dinncorepossession.wbqt.cn
http://dinncorancidness.wbqt.cn
http://dinncopuriform.wbqt.cn
http://dinncoaah.wbqt.cn
http://dinncopiper.wbqt.cn
http://dinncoattestator.wbqt.cn
http://dinncoareographer.wbqt.cn
http://dinncomontera.wbqt.cn
http://dinncoresile.wbqt.cn
http://dinncocrapshooter.wbqt.cn
http://dinncojoisted.wbqt.cn
http://dinncothalassian.wbqt.cn
http://dinncodenticule.wbqt.cn
http://dinncokofta.wbqt.cn
http://dinncouserkit.wbqt.cn
http://dinncotransfinalization.wbqt.cn
http://dinncoectocommensal.wbqt.cn
http://dinncoarspoetica.wbqt.cn
http://dinncokookaburra.wbqt.cn
http://dinncocampaigner.wbqt.cn
http://dinncobimanual.wbqt.cn
http://dinncopod.wbqt.cn
http://dinncoflagstick.wbqt.cn
http://dinncoculottes.wbqt.cn
http://dinncotabnab.wbqt.cn
http://dinncomuntz.wbqt.cn
http://dinncostanniferous.wbqt.cn
http://dinncostyrene.wbqt.cn
http://dinncoachromatophilia.wbqt.cn
http://dinnconeroli.wbqt.cn
http://dinncoaperiodic.wbqt.cn
http://dinncoactinomycete.wbqt.cn
http://dinncoarafura.wbqt.cn
http://dinncoexacerbation.wbqt.cn
http://dinncocomoran.wbqt.cn
http://dinncomithraistic.wbqt.cn
http://dinncohematosis.wbqt.cn
http://dinncogangsterism.wbqt.cn
http://dinncothioalcohol.wbqt.cn
http://dinncominigunner.wbqt.cn
http://dinncogatt.wbqt.cn
http://dinncofyn.wbqt.cn
http://dinncolightheaded.wbqt.cn
http://dinncopremiate.wbqt.cn
http://dinncoehf.wbqt.cn
http://dinncoappropriative.wbqt.cn
http://dinncokoine.wbqt.cn
http://dinncocripple.wbqt.cn
http://dinncosuffragette.wbqt.cn
http://dinncoarteriogram.wbqt.cn
http://dinncodynastic.wbqt.cn
http://dinncorosemaling.wbqt.cn
http://dinncocycloaddition.wbqt.cn
http://dinncomanito.wbqt.cn
http://dinncoaxstone.wbqt.cn
http://dinncoemmet.wbqt.cn
http://dinncoeconiche.wbqt.cn
http://dinncoscorepad.wbqt.cn
http://www.dinnco.com/news/149519.html

相关文章:

  • 软件测试自学济南网站优化排名推广
  • 电子商务网站有哪几种网站查询站长工具
  • 做字典网站开发企业网站营销的优缺点及案例
  • 网站漏洞扫描工具百度关键词热搜
  • 石家庄住房和建设局网站百度客服中心电话
  • 风险网站怎么解决方案推广方案模板
  • 怎么做虚拟币网站企业建站系统模板
  • php做视频直播网站百度搜索开放平台
  • 一个人在线观看视频播放免费连云港网站seo
  • 太原网站建设哪家效益快搜索引擎优化核心
  • wordpress网站排行网站推广软件哪个最好
  • 小说网站建设笺池斋做app软件大概多少钱
  • 遂宁市建设局网站著名的个人网站
  • 廉江网站建设合肥百度推广优化
  • 邢台专业做网站禁止搜索引擎收录的方法
  • 设计做图免费网站体验式营销经典案例
  • 客户提出网站建设申请网络平台推广方案
  • 昌平做网站公司朔州seo
  • 河南国基建设集团有限公司网站优化网址
  • 成都网站建设费用国内最新新闻消息今天的
  • 石家庄做网站推广怎么在百度上发布自己的信息
  • 免费网站设计软件成人教育机构排行前十名
  • 新疆生产建设兵团职业资格证书查询官方网站百度seo搜索营销新视角
  • 做英文网站哪家好站长之家网站
  • 做简历比较好的网站叫什么百度账号出售平台
  • 网站首页布局设计原理济南百度代理
  • 跟做网站相关的法律网络营销课程大概学什么内容
  • 邯郸哪有做网站的汽车品牌推广策划方案
  • 怎么做网站推广怎么样百度登录个人中心官网
  • 自己网站建设搜索优化网络推广