我一直在使用Promises
和async/await
,它们几乎是同一件事吗?通常我要做的就是兑现我的诺言并退还等。
function someFetchThatTakesTime(){
// Promisify the request.
return new Promise((resolve, reject) => {
if(allGood){
resolve();
}else{
reject();
});
}
然后我可以做:
someFetchThatTakesTime()
.then(console.log('all good.')
.catch(console.log('some error occured.');
或者我可以执行以下操作:
async function wrapMyFetch() {
try {
// Make the async call.
data = await someFetchThatTakesTime();
return data;
} catch(err) {
// Propagate the exception up stream.
throw err;
}
}
(async () => {
let response = await wrapMyFetch();
// Do stuff with the response.
})();
我想,到目前为止很清楚。
但是,最近我遇到了这样的情况:我的应用程序不关心等待结果被获取以及数据容器被更新等。假设有一个更大的循环无限运行,任何Promised
请求都将填补空白。随着应用程序的运行。
在那种情况下,我们真的不需要这种async/await
模式吗?我们只想继续前进,只要它们准备好就位(或者在出现错误的情况下就不行),石头就会掉在我们身后。
我想澄清一下:async/await
会迫使事物线性运行,对吗?但是,如果我们不希望线性,并且可以接受生成的任务--Promises
在我们恢复运行周期的某个时候在后台完成它们的工作,就不需要那种async/await
模式吗?那是对的吗?
async
/await
只会迫使事物线性运行,对吗?
不在全球范围内。await
在async
用于它的函数中生成代码,以等待您传递它的承诺,但这只会影响您在其中使用的函数,而不会影响调用该函数的任何函数。
async
函数是用于编写返回承诺的函数的语法糖。await
是用于兑现承诺的语法糖。它们一起可以极大地简化使用Promise(特别是通过使拒绝错误自动在调用树中传播)的使用。
更具体地说,一个async
函数同步运行其代码,直到第一个await
或return
(或直到代码从该函数的末尾运行)为止,此时它返回一个promise。然后,它的逻辑等待诺言完成,然后继续下去。最终,它根据它所await
编辑或return
编辑的最后一个诺言发生的事情(或undefined
在代码执行结束时执行该诺言)来兑现其诺言。
如果您不想等待诺言的履行,则不必这样做,甚至不必执行async
功能。只是不要使用await
它。例如,假设我们有这个包装器,fetch
它可以为我们获取JSON(并修复了API脚枪):
async function fetchJSON(...args) {
const response = await fetch(...args);
if (!response.ok) {
throw new Error("HTTP error " + response.status);
}
return response.json();
}
这是一个async
使用它的函数,该函数执行初始查询以获取要获取的东西的列表,然后并行获取所有这些东西:
async function fetchList(listUrl) {
const list = await fetchJSON(listUrl);
return Promise.all(list.map(item => fetchJSON(itemUrl)));
}
请注意如何fetchList
使用它await
来等待事物列表的获取,但是又不用等待这些项目。它只是从Promise.all
开始获取的项目列表中返回承诺。
同样要注意await
内fetchJSON
品牌fetchJSON
的逻辑等待的fetch
承诺来解决,但不使呼叫者呼叫fetchJSON
等待,除非该呼叫者使用await
。fetchList
仅await
是第一个调用(获取列表),它不会等待列表中的项目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句