当前位置: 首页 > 知识库问答 >
问题:

JavaScript:promission.all()和Async/Await和Map()

公西博实
2023-03-14

我试图理解为什么下面两个代码块会产生不同的结果。

代码块1按预期工作,并返回从数据库中查找的提供程序的数组。另一方面,代码块2返回函数数组。在理解promissione.all()和async/await时,我觉得缺少了一些简单的东西。

代码块的差异如下:

>

  • 块1:创建许诺函数数组,然后使用map运算符将其包装在异步函数中。

    块2:许诺函数的数组被创建为异步函数。因此,不调用map运算符。

    如果您不熟悉Sequelize库,那么调用的findOne()方法将返回一个promise。

    另外值得一提的是,我知道我可以使用单个find查询with和“name in”where子句来获得相同的结果,而不需要为多个select查询创建一个数组的承诺。我只是作为async/await和promission.all()的学习练习。

    代码块1:在promission.all()中使用map()

    private async createProfilePromises(profiles){
    
        let profileProviderFindPromises = [];
    
        //Build the Profile Providers Promises Array.
        profiles.forEach(profile => {
            profileProviderFindPromises.push(
                () => {
                    return BaseRoute.db.models.ProfileProvider.findOne({
                        where: {
                            name: {[BaseRoute.Op.eq]: profile.profileProvider}
                        }
                    })}
            );
        });
    
        //Map and Execute the Promises
        let providers = await Promise.all(profileProviderFindPromises.map(async (myPromise) =>{
            try{
                return await myPromise();
            }catch(err){
                return err.toString();
            }
        }));
    
        //Log the Results
        console.log(providers);
    }
    

    代码块2:在不使用map()的情况下添加异步函数

    private async createProfilePromises(profiles){
    
        let profileProviderFindPromises = [];
    
        //Build the Profile Providers Promises Array.
        profiles.forEach(profile => {
            profileProviderFindPromises.push(
                async () => {
                    try{
                        return await BaseRoute.db.models.ProfileProvider.findOne({
                            where: {
                                name: {[BaseRoute.Op.eq]: profile.profileProvider}
                            }
                        });
                    }catch(e){
                        return e.toString();
                    }
                }
            );
        });
    
        //Execute the Promises
        let providers = await Promise.all(profileProviderFindPromises);
    
        //Log the Results
        console.log(providers);
    }
    
  • 共有1个答案

    云卓
    2023-03-14

    您的代码基本上可以归结为:

      const array = [1, 2, 3];
    
      function fn() { return 1; }
    
      array.map(fn); // [1, 1, 1]
    
      array.push(fn);
      console.log(array); // [1, 2, 3, fn]
    

    您推送一个函数(这是否async并不重要),而是希望推送调用该函数的结果:

      array.push(fn());
    

    或者在您的情况下:

     array.push((async () => { /*...*/ })());
    

    我如何编写您的代码:

     return Promise.all(profiles.map(async profile => {
       try{
         return await BaseRoute.db.models.ProfileProvider.findOne({
           where: {
             name: { [BaseRoute.Op.eq]: profile.profileProvider }
           }
         });
      } catch(e) {
        // seriously: does that make sense? :
        return e.toString();
      }
    }));
    
     类似资料:
    • 我们正在创建一个共享WCF通道,用于异步操作: 这将调用以下服务: 如果我们一次启动3个请求,并在响应上模拟一个长时间运行的任务: 我已经添加了一个我相信正在发生的事情的图像,这只发生在缓冲模式下,在流模式下主线程不会阻塞。

    • Async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用。 Async function 让我们以 async 这个关键字开始。它可以被放置在一个函数前面,如下所示: async function f() { return 1; } 在函数前面的 “async” 这个单词表达了一个简单的事情:即这个函数总是返回一个 promise。其他值将自动被

    • 在第一章节,我们简要介绍了async/.await,并用它来构建一个简单的服务器。本章将更为详细讨论async/.await的它如何工作以及如何async代码与传统的 Rust 程序不同。 async/.await是 Rust 语法的特殊部分,它使得可以 yield 对当前线程的控制而不是阻塞,从而允许在等待操作完成时,其他代码可以运行。 async有两种主要的使用方式:async fn和asyn

    • 用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异步操作。 为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法async和await,可以让coroutine的代码更简洁易读。 请注意,async和await是针对coroutin

    • 本文向大家介绍async和await具体该怎么用?相关面试题,主要包含被问及async和await具体该怎么用?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:

    • 问题内容: 我已经在移动应用程序和Web应用程序中使用了ECMAScript 6 和ECMAScript 7功能(由于Babel)。 第一步显然是达到ECMAScript 6级别。我学习了许多异步模式,promise(确实是很有希望的),生成器(不确定为什么使用*符号)等。其中,promise非常适合我的目的。而且我已经在我的应用程序中使用它们很多次了。 这是我如何实现基本诺言的示例/伪代码- 随