【问题标题】:Using promises in javascript to allow for unchained updates在 javascript 中使用 Promise 来允许非链式更新
【发布时间】:2021-08-02 08:44:35
【问题描述】:

我是 javascript promise 世界的新手,我编写了一个代码来根据一些参数更新我的数据库表。但我希望同时进行所有这些更改,我做了一些研究并遇到了 promise.all promise api。我想知道我做错了什么或者有更好的方法吗? 非常感谢您的帮助。

承诺代码:

try {
  syncEntities = async () => {
    let saveTakerOrder;
    let tradePromises;

    // if no makers in the trade or the taker was not completely filled put it in the orders table
    saveTakerOrder = await dynamodb
      .put({
        TableName: process.env.ORDERS_TABLE_NAME,
        Item:
          makers.length === 0 ||
          taker.initial_quantity !== taker.quantity_removed
            ? taker
            : {
                ...taker,
                status: "CLOSED",
                orderRate: `${taker.side}#CLOSED#${taker.rate}`,
              },
      })
      .promise();

    // if makers exist
    if (makers.length > 0) {
      tradePromises = makers.map(async (maker) => {
        let savedTrade;
        let updatedOrder;
        // trade entity model
        const matchedTrade = {
          id: `TRD${uuid()}`,
          buy_order: taker.side === "BUY" ? taker.id : maker.id,
          sell_order: taker.side === "SELL" ? taker.id : maker.id,
          ticker: maker.ticker,
          rate: maker.rate,
          quantity: maker.quantity_removed,
          createdAt: date.toISOString(),
        };

        // Save the trade to the trades table
        savedTrade = await dynamodb
          .put({
            TableName: process.env.TRADES_TABLE_NAME,
            Item: matchedTrade,
          })
          .promise();

        // Update the order in the orders table if quantity is not filled ELSE close it if completely filled
        if (maker.quantity_removed !== maker.initial_quantity) {
          updatedOrder = await dynamodb
            .update({
              TableName: process.env.ORDERS_TABLE_NAME,
              key: { id: maker.id },
              UpdateExpression:
                "set quantity_removed = :quantity_removed, quantity_remaining = :quantity_remaining",
              ExpressionAttributeValues: {
                ":quantity_remaining": maker.quantity_remaining,
                ":quantity_removed": maker.quantity_removed,
              },
            })
            .promise();
        } else {
          updatedOrder = await dynamodb
            .update({
              TableName: process.env.ORDERS_TABLE_NAME,
              Key: { id: maker.id },
              UpdateExpression: "set #status = :status, orderRate = :orderRate",
              ExpressionAttributeValues: {
                ":status": "CLOSED",
                orderRate: `${maker.side}#CLOSED#${maker.rate}`,
              },
              ExpressionAttributeNames: {
                "#status": "status",
              },
            })
            .promise();
        }

        return Promise.all([savedTrade, updatedOrder]);
      });
    }

    return Promise.all([tradePromises, saveTakerOrder]);
  };

  await Promise.all([syncEntities]);
} catch (error) {
  console.error(error);
  throw new createError.InternalServerError(error);
}

请有人指出我在此代码中做错了什么或帮助我更正谢谢?

【问题讨论】:

  • await dynamodb....中删除awaits

标签: javascript node.js typescript amazon-web-services promise


【解决方案1】:

您需要做的就是从调用中删除awaits,以包含在Promise.all 中的内容。当您await 某事时,它将在继续之前解决承诺。例如,如果您要查看从await dynamodb.update(...).promise() 返回的对象,您会注意到您有一个DynamoDBUpdateResponse 对象(至少我认为这是类型)。但是,如果您删除 await,您将拥有一个 Promise<DynamoDBUpdateResponse> 对象。

致电await Promise.all 后,您仍然可以获得承诺的结果。数组中的每一项都会在结果数组中有一条记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多