我正在嘗試撰寫一個函式,但似乎不知道如何在一個字串陣列上運行API呼叫的回圈,并且只有在所有API呼叫完成后才呼叫回呼函式。無論我如何嘗試,要么函式失敗,要么回呼函式被過早呼叫。
以下是我的代碼:
exports.handler = function(context, event, callback){
const client = context.getTwilioClient();
const sidArr = [];
const cc = event.ccSid;
const exp = event.expSid;
const cvc = event.cvcSid;
sidArr.push(cc, exp, cvc)。
const resArr = [];
for (var i = 0; i < sidArr.length; i ) {
客戶端
.messages(sidArr[i])
.update({ body: '' })
.then((message) =>/span> {
if (resArray.length == sidArr.length) {
callback(null, resArray);
} else {
resArray.push(message.sid)。
}
});
}
};
uj5u.com熱心網友回復:
如果你不能使用async和await,那么你可以直接使用Promise.all()并像這樣并行地運行它們:
并行運行它們:
let promises = []。
for (var i = 0; i < sidArr.length; i ) {
promises.push(
承諾
.messages(sidArr[i])
.update({ body: '' })
.then((message) => message.sid)
);
}
Promise.all(promises)
.then((results) => callback(null, results)
.catch((err) => callback(err))。
當然,像這樣把一個承諾變成一個普通的回呼是一種反模式的做法。 你真的應該改變介面并將承諾回傳給呼叫者,這樣呼叫者就可以直接在承諾上使用 .then() 和 .catch() 。
在沒有async和await的情況下依次運行它們:
或者,如果你想在不使用async和await的情況下按順序運行它們(不是并行的),那么你可以用老式的方法來進行異步迭代(我們在async/await之前所做的):
function run(sidArr, callback){
let index = 0;
let results = [];
function next() {
//檢查我們是否完成并呼叫回呼。
if (index >= sidArr.length) {
//確保回呼總是被異步呼叫。
//即使sidArr為空。
setImmediate(() => callback(null, results) )。
return。
}
//仍有更多的內容需要處理。
客戶端
.messages(sidArr[index ] )
.update({ body: '' })
.then((message) =>/span> {
//保存結果并進行下一次回圈迭代。
results.push(message.sid)。
next()。
})
.catch(callback)。
}
next();
}
run(sidArr, putYourCompletionCallbackHere)。
用async和await依次運行它們:
為了完整起見,當你可以使用async和await時,你將如何順序運行它們:
async function run(sidArr, callback) {
try {
let results = [];
for (var i = 0; i < sidArr.length; i ) {
let data = await client.messages(sidArr[i]).update({ body: '' })。)
results.push(data.sid) 。
}
callback(null, results)。
} catch (e) {
callback(e)。
}
}
run(sidArr, putYourCompletionCallbackHere) 。
uj5u.com熱心網友回復:
update方法回傳一個Promise。在sidArr陣列上回圈,為陣列中的每個專案呼叫messages和update方法。將回傳的Promise存入一個新的陣列中。
你可以用靜態的Promise.all函式來等待陣列中的所有承諾完成。其結果將是一個包含所有已解決的承諾的陣列。
然后在每個承諾上進行回圈。
然后在每個結果上再回圈一次,提取sid屬性。
exports.handler = function(context, event, callback){
const client = context.getTwilioClient();
const sidArr = [];
const cc = event.ccSid;
const exp = event.expSid;
const cvc = event.cvcSid;
sidArr.push(cc, exp, cvc)。
const requests = sidArr.map(message =>
client.messages(message).update({ body: "" })
);
Promise.all(requests)
.then(messages => messages。 map(({ sid }) => sid)
.then(sids => callback(sids))
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/327340.html
標籤:
下一篇:如何獲得前6條短信
