javascript - 推迟异步服务调用,直到 promise 得到解决

标签 javascript node.js promise

我想创建一个 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适用于一系列 promise 。 twilioNumbers &&... 行生成一个 Promise 数组,因此您在另一个数组内有一个 Promise 数组,这是行不通的。

因此您可以使用展开运算符:

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);
}

关于javascript - 推迟异步服务调用,直到 promise 得到解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58439564/

相关文章:

Javascript - 无法确定 JSON 对象是否包含 true

node.js - Cloud9 安装问题

javascript - 使用 Dexie 和 Svelte 从 IndexedDB 中检索值

javascript - 从 Node.js 中的 Promise(Bluebird) 返回值

javascript - 如何使用 .reduce() 将数组转换为对象数组

javascript - 将对象文字插入数组

sql - 使用 NodeJS 进行 Sequelize 无法连接有限制的表

javascript - 嵌套的 Promise.map() 不返回任何结果

javascript - AngularJS ngmodel 绑定(bind)说明?

java - ESRI 框架 : java vs javascript