我一直在使用ECMAScript
很明显第一步是ECMAScript
var myPromise = new Promise(
function (resolve,reject) {
var x = MyDataStore(myObj);
resolve(x);
});
myPromise.then(
function (x) {
init(x);
});
随着时间的推移,我遇到了ECMAScript
同样,这里有一个伪代码,描述了我的异步等待函数的样子-
async function myAsyncFunction (myObj) {
var x = new MyDataStore(myObj);
return await x.init();
}
var returnVal = await myAsyncFunction(obj);
把语法错误(如果有的话)放在一边,我觉得它们做的事情完全一样。我几乎可以用async、Waities取代我的大部分promise。
当promise做类似的工作时,为什么需要异步、等待?
async等待解决更大的问题吗?或者这只是一个不同的解决方案?
正如我前面所说,我能够使用Promissions和async,等待解决同样的问题。有什么具体的问题需要异步解决吗?
补充说明:
我一直在使用异步,等待和promise在我的React项目和Node.js模块广泛。反应特别早,并采用了很多ECMAScript
为什么异步,等待promise做类似工作时需要?async等待解决更大的问题吗?或者这只是一个不同的解决方案?正如我前面所说,我能够使用Promissions和Async,等待解决同样的问题。有什么具体的问题需要异步解决吗?
首先,您必须了解的是,async
/wait
语法只是语法糖,旨在增强promise。事实上,async
函数的返回值是一个promise。async
/wait
语法为我们提供了以同步方式编写异步的可能性。这里有一个例子:
promise链接:
function logFetch(url) {
return fetch(url)
.then(response => response.text())
.then(text => {
console.log(text);
}).catch(err => {
console.error('fetch failed', err);
});
}
异步
功能:
async function logFetch(url) {
try {
const response = await fetch(url);
console.log(await response.text());
}
catch (err) {
console.log('fetch failed', err);
}
}
在上面的示例中,wait
等待promise(fetch(url)
)被解析或拒绝。如果promise被解析,则该值存储在response
变量中,如果promise被拒绝,则会抛出错误,从而进入catch
块。
我们已经看到,使用async
/await
可能比promise链更具可读性。当我们使用的promise数量增加时,情况尤其如此。promise链接和async
/wait
解决了回调地狱的问题,您选择哪种方法取决于个人偏好。
Async/Await在更复杂的场景中提供了更好的语法。特别是,处理循环或某些其他构造(如try
/catch
)的任何内容。
例如:
while (!value) {
const intermediate = await operation1();
value = await operation2(intermediate);
}
仅仅使用promise,这个例子就要复杂得多。
为什么异步,等待promise做类似工作时需要?async等待解决更大的问题吗?
async/wait
只是给您一种异步代码的同步感觉。这是一种非常优雅的句法糖。
对于简单的查询和数据操作,Promises可能很简单,但是如果你遇到复杂的数据操作之类的场景,如果代码看起来像是同步的,就更容易理解发生了什么(换句话说,语法在和本身是一种“附带复杂性”的形式,异步/等待可以绕过它)。
如果您有兴趣了解,可以使用类似于co
(与生成器一起)的库来提供相同的感觉。像这样的东西是为了解决async/await
最终(本机)解决的问题而开发的。
我用webpack建立了一个浏览器umd库。 我正在侦听输入文件的onchange事件。当有人提交图像/文件时,它会将其转换为base64。我试图让它尽可能看起来不那么明显,所以我使用了promises和wait/asynchttps://blog.shovonhasan.com/using-promises-with-filereader/. 但是,有一个问题-当我调用convertToBase
问题内容: 之间有什么区别: 和 和 问题答案: 注意事项 : 这个答案仅涵盖了系列和系列之间的时序差异。。 为了这个答案的目的,我将使用一些示例方法: 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后解析。 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后被拒绝。 调用将启动计时器。在所有延迟完成后,可以使用等待一些延迟来解决,但请记住它们是同时执行的: 例子
问题内容: 之间有什么区别: 和 和 问题答案: 注意事项: 这个答案仅涵盖了await系列和系列之间的时序差异Promise.all。请务必阅读@mikep的综合答案,其中也涵盖了错误处理方面更重要的区别。 出于此答案的目的,我将使用一些示例方法: res(ms) 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后解析。 rej(ms) 是一个函数,它需要一个整数毫秒,并返回一个
问题内容: 我需要一些帮助,以了解使用CountDownLatch与传统的wait- notify相比的优势。我认为notifyAll()确实做了同样的事情,并且似乎更易于使用(可能是由于熟悉)。 另外,CountDownLatch中的wait()和await()有什么区别? 谢谢 ! 编辑:我想我需要改写我的查询: Await()根据文档说: 使当前线程 等待, 直到锁存器递减计数到零为止,除非
问题内容: Selenium WebDriver中有隐式和显式等待。它们之间有什么区别? 请分享有关Selenium WebDriver的知识。请显示带有隐式和显式等待的实时示例。 问题答案: 检查以下链接: -通过轮询DOM来指示Web驱动程序等待一段时间。声明隐式等待后,它将在Web驱动程序实例的整个生命周期中都可用。默认情况下,该值将为0。如果设置了更长的默认值,则该行为将根据浏览器/驱动程
我正在使用静态编程语言反应器(Mono和Flux),我想知道使用(来自kotlin-coroutines-reactive)函数和(来自React)之间的区别。我带来了两个例子来展示我正在努力做的事情。 示例1(具有等待功能): 输出:带有IllegalStateException堆栈跟踪的“错误”。 示例2(具有订阅功能): 输出:只是“错误”。 为什么示例1显示堆栈跟踪而示例2不显示? 谢谢