当前位置: 首页 > 面试题库 >

在新的Promise()构造函数中使用async / await是一种反模式吗?

宁欣怿
2023-03-14
问题内容

我正在使用该async.eachLimit函数来控制一次最大操作数

const { eachLimit } = require("async");

function myFunction() {
 return new Promise(async (resolve, reject) => {
   eachLimit((await getAsyncArray), 500, (item, callback) => {
     // do other things that use native promises.
   }, (error) => {
     if (error) return reject(error);
     // resolve here passing the next value.
   });
 });
}

如您所见,我无法将该myFunction函数声明为异步的,因为我无权访问该eachLimit函数的第二个回调中的值。


问题答案:

您实际上在promise构造函数执行程序函数内使用了promise,因此这是Promise构造函数anti-pattern。

您的代码很好地说明了主要风险:没有安全地传播所有错误。读为什么在那里。

此外,使用async/ await会使相同的陷阱更加令人惊讶。相比:

let p = new Promise(resolve => {

  ""(); // TypeError

  resolve();

});



(async () => {

  await p;

})().catch(e => console.log("Caught: " + e)); // Catches it.

天真(错误)的async等效项:

let p = new Promise(async resolve => {

  ""(); // TypeError

  resolve();

});



(async () => {

  await p;

})().catch(e => console.log("Caught: " + e)); // Doesn't catch it!

在浏览器的网络控制台中查找最后一个。

第一个起作用是因为Promise构造函数执行程序函数中的任何立即异常都可以方便地拒绝新构造的Promise(但是.then在您自己的任何内部)。

第二个不起作用,因为async函数中的任何立即异常都会拒绝 函数本身 返回async_的 _隐含承诺

由于未使用promise构造函数执行程序函数的返回值,所以这是个坏消息!

您的密码

没有理由不能定义myFunctionasync

async function myFunction() {
  let array = await getAsyncArray();
  return new Promise((resolve, reject) => {
    eachLimit(array, 500, (item, callback) => {
      // do other things that use native promises.
    }, error => {
      if (error) return reject(error);
      // resolve here passing the next value.
    });
  });
}

虽然为什么要在使用时使用过时的并发控制库await



 类似资料:
  • 我正在尝试使用Promise API编写重新连接到超时数据库的代码。 我最后做的是把连接DB的promise包装成一个promise,但我不确定这是否是最好的方式。我想可能有一种方法可以使用最初的promise,从尝试连接到数据库,但我无法找到它。 我认为没有setTimeout块是可能的,但我无法解决它。

  • 所以我一直很高兴地使用async/await,因为Firebase云函数支持节点8。不过我有一件事要做。当使用可调用函数时,会告诉您必须在函数中返回promise,否则它将无法正常工作。当使用原始promise时,我很清楚如何使用它: 但是现在,随着异步等待,我不确定如何返回这个“promise链”: 有人知道吗?

  • 我试图从一个调用rest API的方法返回一些测试数据。为了模拟rest api调用,我添加了一些延迟来使用async-await模式返回一个promise,但它并不像预期的那样工作。 我对JavaScript中的async-await模式的理解是,从异步函数返回的任何值都将作为承诺返回,因此该函数应该将值100作为承诺返回,因此使用

  • 在像 JavaScript 这种没有类的概念的语言中,如果想创建特定的实例对象,可以通过在函数之前加上 new 关键字来实现。在调用构造函数时可以传入参数以初始化实例对象的属性值。用这种方式创建的实例对象的属性和方法是独立的,不与其他实例对象共享。 在 JavaScript 中,构造函数一般长这样: function FamilyMember( name, age ) { this.name =

  • 问题内容: 我目前正在使用Builder模式,紧跟在Wikipedia文章 Builder模式 http://en.wikipedia.org/wiki/Builder_pattern中建议的Java实现 这是一个示例代码,说明了我的实现 在我的一些使用此类的应用程序中,我碰巧发现了非常相似的建筑代码,因此我想将其子类化,并将所有重复的代码移入其构造函数中。这就是问题所在。 如何调用超类生成器并将

  • 这是我的方法: 我显示加载程序时,但使用在抛给我一个关于字保留的错误。对于验证,我使用VeeValester 如何使用wait-insidepromise?