在JavaScript中执行异步方法的顺序

时间:2019-01-19 19:48:32

标签: javascript

我在JavaScript NodeJS Sequelize中有三种方法。 调用它们将保存如下:

setTransferHistory(senderId, recipientId, amountMoney, transferTitle);
setWidgetStatus(senderId);
setWidgetStatus(recipientId);

每种方法的确会在mysql数据库中进行更新或选择。 按顺序进行制作非常重要,但并非总是如此。

我知道解决此问题的方法是在setTransferHistory方法中使用单词,因此:

  function setTransferHistory(
    senderId,
    recipientId,
    amountMoney,
    transferTitle,
  ) {
    Transaction.create({
      id_sender: senderId,
      id_recipient: recipientId,
      date_time: getTodayDate(),
      amount_money: amountMoney,
      transfer_title: transferTitle,
    }).then(() => {
      setWidgetStatus(senderId);
      setWidgetStatus(recipientId);
    });
  }

...但是我不希望这两种方法都包含在此方法中。我只想一个写一个。

3 个答案:

答案 0 :(得分:0)

由于Transaction.create返回了Promise,因此您可以让setTransferHistory返回该值,并在setWidgetStatus的诺言得到兑现之后推迟执行setTransferHistory。因此:

const setTransferHistory = (
  senderId,
  recipientId,
  amountMoney,
  transferTitle
) =>
  Transaction.create({
    id_sender: senderId,
    id_recipient: recipientId,
    date_time: getTodayDate(),
    amount_money: amountMoney,
    transfer_title: transferTitle
  });

您可以选择以下一种:

setTransferHistory(/* args ... */).then(() => {
  setWidgetSatus(senderId);
  setWidgetSatus(recipientId);
});

或者使用await-与诺言一起使用,一旦在async函数中使用它,setTransferHistory就不需要异步:

async function foobar() {
  await setTransferHistory(/* args ... */);

  setWidgetSatus(senderId);
  setWidgetSatus(recipientId);
}

当然,在这一点上,您可以直接使用Transation.create,但要由您自己决定是否要添加抽象层。

答案 1 :(得分:-1)

您需要做的就是return setTransferHistory承诺create给您,这样您就可以在通话结果上调用then

function setTransferHistory(senderId, recipientId, amountMoney, transferTitle) {
  return Transaction.create({
//^^^^^^
    id_sender: senderId,
    id_recipient: recipientId,
    date_time: getTodayDate(),
    amount_money: amountMoney,
    transfer_title: transferTitle,
  });
}

setTransferHistory(senderId, recipientId, amountMoney, transferTitle).then(() => {
//                                                                   ^^^^^
  setWidgetStatus(senderId);
  setWidgetStatus(recipientId);
});

答案 2 :(得分:-1)

如今,处理诺言时,好的做法是使用async / await关键字。它们基本上允许您以同步方式运行异步代码。使用它们,您的代码将如下所示:

async function setTransferHistory(senderId, recipientId, amountMoney, transferTitle) {
     return await Transaction.create({
       id_sender: senderId,
       id_recipient: recipientId,
       date_time: getTodayDate(),
       amount_money: amountMoney,
       transfer_title: transferTitle,
     });
}

await setTransferHistory(senderId, recipientId, amountMoney, transferTitle);
setWidgetStatus(senderId);
setWidgetStatus(recipientId);

await 关键字停止函数的执行,并等待Transaction.create()的结果,并且需要 async 才能在函数内部使用await。

希望这会有所帮助。