簡體   English   中英

推遲異步服務調用,直到 promise 得到解決

[英]Defer an async service call until promise is resolved

我想創建一個 Twilio API 調用數組,稍后在Promise.all中解決。

TwilioClient.messages.create(payload)在返回的 promise (A) 中被立即調用。 我怎樣才能推遲到Promise.all鏈解決它(B)?

let twilioTexts = [];
if (twilioNumbers) {
    twilioTexts = twilioNumbers.map(phoneNumber => getTwilioText(mailTokens, phoneNumber));
    // (A) ==> Twilio is sending messages here upon assigning to variable `twilioTexts`.
}

await Promise.all([
  // do other stuff
  ...twilioTexts, // (B) ==> instead, Twilio should make all calls here
]);

...

function getTwilioText(mailTokens, phoneNumber) {
    return new Promise((resolve, reject) => {
        let payload = {
          body: `[Incoming Order!]`,
          from: 'my number',
          to: phoneNumber,
        };

        TwilioClient.messages.create(payload);
    });
}

編輯:

await Promise.all([
  // do other async stuff in parallel
  // check if twilioNumbers then spread map into Promise.all array
  twilioNumbers && ...twilioNumbers.map(phoneNumber => getTwilioText(mailTokens, phoneNumber)),
]);

function getTwilioText(mailTokens, phoneNumber) {
    let payload = {
        body: `[Incoming Order!]`,
        from: 'my number',
        to: phoneNumber,
    };

    return TwilioClient.messages.create(payload);
}

您的第二個示例幾乎就在那里,但是Promise.all可以處理一系列承諾。 twilioNumbers &&...行產生了一組承諾,所以你另一個數組中有一組承諾,這是行不通的。

所以你可以使用擴展運算符:

await Promise.all([
  // do other stuff
  ...(twilioNumbers 
      ? twilioNumbers.map(phoneNumber => getTwilioText(mailTokens, phoneNumber))
      : []
  ),
]);

...

function getTwilioText(mailTokens, phoneNumber) {
    let payload = {
        body: `[Incoming Order!]`,
        from: 'my number',
        to: phoneNumber,
    };

    return TwilioClient.messages.create(payload);
}

在這一點上,它有點冗長,所以你可能想把這部分排除在外:

await Promise.all([
  // do other stuff
  getTwilioTexts(twilioNumbers, mailTokens),
]);

...


// returns a promise for an array
async function getTwilioTexts(numbers, mailTokens) {
    return numbers
        ? Promise.all(numbers.map(num => getTwilioText(mailTokens, num)))
        : [];
}

function getTwilioText(mailTokens, phoneNumber) {
    let payload = {
        body: `[Incoming Order!]`,
        from: 'my number',
        to: phoneNumber,
    };

    return TwilioClient.messages.create(payload);
}

你似乎在尋找

const otherPromises = // do other stuff, *triggered first*
const twilioTexts = (twilioNumbers || []).map(phoneNumber => getTwilioText(mailTokens, phoneNumber));

await Promise.all([
  ...otherPromises,
  ...twilioTexts,
]);

最終,這並不重要,因為無論如何您都想在發送文本的同時運行其他東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM