gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:45:01 25 4
gpt4 key购买 nike

我想创建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com