node js await 问题

news/2024/7/19 15:43:36 标签: 设计模式, js, 数据结构, linux, eclipse

当 await 关键字与异步函数一起使用时,它的真正优势就变得明显了 —— 事实上, await 只在异步函数里面才起作用。它可以放在任何异步的,基于 promise 的函数之前。它会暂停代码在该行上,直到 promise 完成,然后返回结果值。在暂停的同时,其他正在等待执行的代码就有机会执行了。
举个例子:

function resolveAfter2Seconds() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('resolved');
        }, 2000);
    });
}

async function asyncCall() {
    console.log('calling');
    const result = await resolveAfter2Seconds();
    console.log(result);
}

asyncCall();

输出如下:

calling
resolved
可以看到等待了2s后才输出之后的打印。
await 让你的代码看起来是同步的,在某种程度上,也使得它的行为更加地同步。 await 关键字会阻塞其后的代码,直到promise完成,就像执行同步操作一样。它确实可以允许其他任务在此期间继续运行,但您自己的代码被阻塞。
这意味着您的代码可能会因为大量await的promises相继发生而变慢。每个await都会等待前一个完成,而你实际想要的是所有的这些promises同时开始处理(就像我们没有使用async/await时那样)。
有一种模式可以缓解这个问题——通过将 Promise 对象存储在变量中来同时开始它们,然后等待它们全部执行完毕。

举个例子:

 function resolveAfter2Seconds() {
    return  new Promise(resolve => {
        setTimeout(() => {
            resolve('resolved');
            console.log('resolved');
        }, 2000);
    });
}

async function timeTest() {
    await resolveAfter2Seconds();
    await resolveAfter2Seconds();
    await resolveAfter2Seconds();
}

在这里,我们直接等待所有三个resolveAfter2Seconds()调用,使每个调用2秒钟。
换一种方式:

 function resolveAfter2Seconds() {
    return  new Promise(resolve => {
        setTimeout(() => {
            resolve('resolved');
            console.log('resolved');
        }, 2000);
    });
}

async function timeTest() {
    const timeoutPromise1 = resolveAfter2Seconds();
    const timeoutPromise2 = resolveAfter2Seconds();
    const timeoutPromise3 = resolveAfter2Seconds();

    await timeoutPromise1;
    await timeoutPromise2;
    await timeoutPromise3;
}

在这里,我们将三个Promise对象存储在变量中,这样可以同时启动它们关联的进程。
接下来,我们等待他们的结果 - 因为promise都在基本上同时开始处理,promise将同时完成以上就是node js await 的一些问题了。


http://www.niftyadmin.cn/n/1600158.html

相关文章

Erlang特点拾遗(1)

Erlang特点拾遗(1) %% .标志语句定义结束 ;标志段落 list_max([], Res) -> Res;list_max([Head|Rest], Result_so_far) when Head > Result_so_far -> list_max(Rest, Head); % 这里函数 list_max/2还没有结束list_max([Head|Rest], Result_so_far) -> list_max…

node js filter 问题

filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。其返回值是一个新的、由通过测试的元素组成的数组,如果没有任何数组元素通过测试,则返回空数组。 举个例子: function isBigEnou…

node js 解析赋值问题

解构赋值语法是一种 Javascript 表达式。通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量。 举个例子: var [x, y, z] [tttt, aaaa, bbbb];console.log(x,y,z);输出如下: tttt aaaa bbbb我们还可以用这种方式进行变量的交换。 举个例子…

CouchDb初步了解

CouchDb 一个用Erlang写的数据库系统.不是关系数据库而是一个文档数据库. 啥叫文档数据库呀? 其实,就是一个巨大的分布的HashMap.(类似Python的dict). CouchDb的API是JSON(JavaScript Object Notation)的. 和普通关系数据库的区别: 1. 没有SQL,存储半结构化数据 2.分布…

node js 字符串问题

我们都知道字符串在各个语言当中都是经常使用的对象,下面让我们看一下在node js 中字符串可能遇到的问题。 举个例子: var i 33; if (i 33) {console.log(tttttttt); }输出如下: tttttttt可以看到,当我们做字符串变量比较的时…

Java操作Excel文件基础--Java Excel API

Java Excel API是一个成熟的、开源的Java API,主页地址:http://jexcelapi.sourceforge.net/,通过它开发人员可以动态地读取、写入或者修改Excel文件。利用这些APIJava开发人员,可以非常轻松地完成Excel读取、写入和修改&#xff0…

aws lambda 创建

当你使用Lambda控制台创建一个Node.js的Lambda函数的时候。Lambda会自动为该函数创建默认代码。 使用控制台创建一个Lambda函数的步骤: 1.打开Lambda控制台的函数页面。 2.选择创建函数。 3.在基本信息下,执行以下操作。 对于函数名称,输…

JavaScript获取HTML DOM节点元素的方法的总结

在Web应用程序特别是Web2.0程序开发中,经常要获取页面中某个元素,然后更新该元素的样式、内容等。如何获取要更新的元素,是首先要解决的问题。令人欣慰的是,使用JavaScript获取节点的方法有很多种,这里简单做一下总结&…