在Promise链中共享变量的方法-创新互联

怎么在Promise链中共享变量?其实要解决这个问题也不难,为此小编总结了这篇文章,下面我们一起来看看在Promise链中共享变量的方法。

创新互联是一家专业从事成都网站制作、成都做网站、外贸营销网站建设的网络公司。作为专业的建站公司,创新互联依托的技术实力、以及多年的网站运营经验,为您提供专业的成都网站建设、网络营销推广及网站设计开发服务!

问题

connection变量在A处定义,在BC处都需要使用。但是,由于A、B、C处于各自独立的作用域,connection变量将不能在BC处直接使用。

db.open()
   .then(connection => // A
   { 
     return connection.select(
     {
       name: 'Fundebug'
     });
   })
   .then(result =>
   {
     connection.query(); // B
   })
   .catch(error =>
   {
     // ...
   })
   .finally(() =>
   {
     connection.close(); // C
   });

方法1:使用高阶作用域变量

在更高阶的作用域定义connection变量,在D处赋值,这样在BC处直接使用了。

let connection; // A
db.open()
   .then(conn =>
   {
     connection = conn; // D
     return connection.select(
     {
       name: 'Fundebug'
     });
   })
   .then(result =>
   {
     connection.query(); // B
   })
   .catch(error =>
   {
     // ...
   })
   .finally(() =>
   {
     connection.close(); // C
   });

问题:如果需要共享的变量过多(这是很常见的情况),则需要在高阶作用域中定义很多变量,这样非常麻烦,代码也比较冗余。

方法2:嵌套作用域

将需要使用connection变量的Promise链内嵌到对应then回调函数中,这样在BC处直接使用了。

db.open()
   .then(connection => // A
     {
       return connection.select(
         {
           name: 'Fundebug'
         })
         .then(result =>
         {
           connection.query(); // B
         })
         .catch(error =>
         {
           // ...
         })
         .finally(() =>
         {
           connection.close(); // C
         });
     });

问题:之所以使用Promise,就是为了避免回调地域,将多层嵌套的回调函数转化为链式的then调用;如果为了共享变量采用嵌套写法,则要Promise有何用?

方法3:return多个值

intermediate变量在A处定义并赋值,而在B处需要使用;但是,由于AB处于不同的作用域,B出并不能直接使用intermediate变量:

return asyncFunc1()
   .then(result1 =>
   { 
     const intermediate = ··· ; // A
     return asyncFunc2();
   })
   .then(result2 =>
   { 
     console.log(intermediate); // B
   });

A处使用Promise.all返回多个值,就可以将intermediate变量的值传递到B处:

return asyncFunc1()
   .then(result1 =>
   {
     const intermediate = ···; 
     return Promise.all([asyncFunc2(), intermediate]); // A
   })
   .then(([result2, intermediate]) =>
   {
     console.log(intermediate); // B
   });

问题:  使用Promise.all用于传递共享变量,看似巧妙,但是有点大材小用,并不合理;不能将变量传递到.catch()finally()中;当共享变量过多,或者需要跨过数个.then(),需要return的值会很多。

方法4: 使用Async/Await

Async/Await是写异步代码的新方式,可以替代Promise,它使得异步代码看起来像同步代码,可以将多个异步操作写在同一个作用域中,这样就不存在传递共享变量的问题了!!!

方法1中的示例可以改写为:

try
{
   var connection = await db.open(); // A 
   const result = await connection.select(
   {
     name: 'Fundebug'
   });
   connection.query(); // B
}
catch (error)
{
   // ...
}
finally
{
   connection.close(); // C
}

方法3中的示例可以改写为:

try
{
   result1 = await asyncFunc1();
   const intermediate = ··· ;
   result2 = await asyncFunc2();
   console.log(intermediate);
}
catch (error)
{
   // ...
}

毋庸赘言,Async/Await直接将问题消灭了。

看完这篇文章,你们学会在Promise链中共享变量的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


名称栏目:在Promise链中共享变量的方法-创新互联
网站链接:http://scyanting.com/article/igspg.html