关于承诺和需要异步/等待的澄清

姆比利亚诺夫

我一直在使用Promisesasync/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模式吗?那是对的吗?

TJ人群

async/await只会迫使事物线性运行,对吗?

不在全球范围内。awaitasync用于它的函数中生成代码,以等待您传递它的承诺,但这只会影响您在其中使用的函数,而不会影响调用该函数的任何函数。

async函数是用于编写返回承诺的函数的语法糖。await是用于兑现承诺的语法糖。它们一起可以极大地简化使用Promise(特别是通过使拒绝错误自动在调用树中传播)的使用。

更具体地说,一个async函数同步运行其代码,直到第一个awaitreturn(或直到代码从该函数的末尾运行)为止,此时它返回一个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开始获取的项目列表中返回承诺

同样要注意awaitfetchJSON品牌fetchJSON的逻辑等待的fetch承诺来解决,但使呼叫者呼叫fetchJSON等待,除非该呼叫者使用awaitfetchListawait是第一个调用(获取列表),它不会等待列表中的项目。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

需要进行异步澄清并等待

来自分类Dev

澄清等待/异步和任务

来自分类Dev

等待异步澄清

来自分类Dev

需要对Scala中的期货和承诺进行澄清

来自分类Dev

如何链接承诺?—需要澄清

来自分类Dev

在承诺内异步/等待

来自分类Dev

异步/等待捕获被拒绝的承诺

来自分类Dev

异步等待所有承诺

来自分类Dev

使用承诺替代异步/等待

来自分类Dev

异步 - 等待不等待承诺解决

来自分类Dev

什么时候在C#中需要异步和等待?

来自分类Dev

需要澄清setLocalDescription和RTCSessionDescription

来自分类Dev

节点回调以异步/等待承诺

来自分类Dev

对于循环,异步等待,承诺-Javascript

来自分类Dev

Node.JS - 承诺异步/等待示例

来自分类Dev

异步/等待不返回已解决的承诺

来自分类Dev

在 componentWillMount 中链接 api - 异步等待或承诺

来自分类Dev

异步和等待与循环

来自分类Dev

异步/等待和递归

来自分类Dev

无尽的异步和等待?

来自分类Dev

异步等待和并行

来自分类Dev

异步等待和线程

来自分类Dev

异步和等待

来自分类Dev

等待和防止死锁-澄清吗?

来自分类Dev

异步解析顺序,用于等待单个承诺与异步迭代器

来自分类Dev

Docker和Consul的示例:需要澄清

来自分类Dev

Docker和Consul的示例:需要澄清

来自分类Dev

需要澄清元素和索引之间的区别

来自分类Dev

关于承诺的异步性及其实现方式