Javascript 在数据库中进行异步多次更新

Javascript 在数据库中进行异步多次更新,javascript,node.js,postgresql,async-await,Javascript,Node.js,Postgresql,Async Await,我有一个要插入数据库的元素数组。对于每个元素,我必须检查它们的完整性(如果找不到元素,我会发送“错误请求”): 我以下面“3)段为例: 这个技巧适用于我代码的其他部分中的许多用例,但不适用于这个特定的用例。我有一个错误: const r = await nextAsyncFunction(); TypeError: nextAsyncFunction is not a function 我不知道为什么。如果有人能帮我一把,

我有一个要插入数据库的元素数组。对于每个元素,我必须检查它们的完整性(如果找不到元素,我会发送“错误请求”):

我以下面“3)段为例:

这个技巧适用于我代码的其他部分中的许多用例,但不适用于这个特定的用例。我有一个错误:

          const r = await nextAsyncFunction();
                         
TypeError: nextAsyncFunction is not a function

我不知道为什么。如果有人能帮我一把,那就太好了:)

错误消息是正确的,
reduce
的第二个参数是要减少的数组的下一个条目,在这种情况下是
promises
数组

因此,最直接的解决办法是等待承诺,而不是试图称之为:

const r = await nextAsyncFunction;  // no () on the end
为什么使用
nextAsyncFunction
名称而不是
nextPromise
或其变体是不言而喻的-这肯定会造成混淆并导致错误

除此之外,似乎还有一些bug等待发生:

  • 如果发送了
    “错误请求”
    消息,则代码将继续执行,并尝试更新数据库,并解决
    forEach
    函数推送的承诺。随后,
    res.send(ret)
    在尝试发送第二组响应头时将(很可能?)出错。尝试执行
    错误请求
    错误,并在promise
    catch
    处理程序中捕获该错误,以发送
    400
    响应

  • 在执行之前,不会尝试等待异步处理完成

      res.send(ret)
    
    如果成功,将发送一个空数组

reduce(async(previousPromise,nextPromise)
构造是一种相当复杂的方法,通过使用
for…of
来等待承诺依次得到解决:

(async function() {
   for( promise of promises) {
       ret.push( await promise);
   }
}()
.then( ()=> res.send(ret));
.catch( ()=> // server error response?

处理由有效和无效的
pj
请求值混合而成的请求可能需要进一步注意。

错误消息是正确的,
reduce
的第二个参数是要减少的数组的下一个条目,在这种情况下是
数组

因此,最直接的解决办法是等待承诺,而不是试图称之为:

const r = await nextAsyncFunction;  // no () on the end
为什么使用
nextAsyncFunction
名称而不是
nextPromise
或其变体是不言而喻的-这肯定会造成混淆并导致错误

除此之外,似乎还有一些bug等待发生:

  • 如果发送了
    “错误请求”
    消息,则代码将继续执行并尝试更新数据库,并解决
    forEach
    函数推送的承诺。随后
    res.send(ret)
    将(很可能?)尝试发送第二组响应头时出错。请尝试发送
    错误请求
    错误,并在承诺
    捕获
    处理程序中捕获该错误,以发送
    400
    响应

  • 在执行之前,不会尝试等待异步处理完成

      res.send(ret)
    
    如果成功,将发送一个空数组

reduce(async(previousPromise,nextPromise)
构造是一种相当复杂的方法,通过使用
for…of
来等待承诺依次得到解决:

(async function() {
   for( promise of promises) {
       ret.push( await promise);
   }
}()
.then( ()=> res.send(ret));
.catch( ()=> // server error response?

处理由有效和无效的
pj
请求值混合而成的请求可能需要进一步注意。

您是否尝试过
for..of
循环?
for(让pj of req.body.pjs){wait things}
我没有,但我要记住,有时候我只是做一些无用的复杂的事情…traktor53的解释帮助我解决了我的问题。谢谢Matt!你试过
for..of
循环吗?
for(让pj of req.body.pjs){等待事情}
我没有,但我要记住,有时候我只是做一些无用的复杂的事情……traktor53的解释帮助我解决了问题。谢谢Matt!谢谢你的评论。你说得对,我需要进一步注意处理一些特定案例,这在我的路线图上,但我首先想了解为什么p出现了问题,您的解释非常全面。再次感谢:)@DJ9114我发现,如链接博客所示,等待承诺按创建顺序兑现的用例有点做作,当所有承诺的结果都是令人感兴趣的时候,这将是一个更好、更标准的选择。编码愉快。谢谢你的评论。你说得对,我需要在tention需要处理一些具体案例,这在我的路线图上,但我首先想了解问题发生的原因,您的解释非常全面。再次感谢:)@djcaesar9114我找到了等待承诺按照创建顺序兑现的用例,如链接博客所示,是有点做作的,当所有承诺的结果都令人感兴趣时,这将是一个更好、更标准的选择。快乐编码。