我不得不問,因為我找不到一個像樣的方法來解決它。我已經按照How to Resolve JavaScript Promises Sequentially(一個接一個)中的教程進行了操作,但是在我更改它后它仍然無法處理我的情況。
我呼叫了一個 SQLite 查詢來獲取資料并獲取一組資料作為回應。然后我呼叫 a 函式開始等待整個其他行程,直到這個子行程完成。
樣品回復:
[{"TSTaskID": 1638938895}, {"TSTaskID": 1638945283}]
async function getUnsyncRecordFromLocal() {
/// ... and the rest of the code send query to SQLite
callTasks(resp);
}
const callTasks = async (response) => {
const allPromise = Promise.all(response.map(async (_item) => {
task1(_item)
.then((resp1) => task2(resp1))
.then((resp2) => task3(resp2))
.catch(console.error);
}))
const lists = await allPromise;
}
const task1 = async (TSTaskID) => {
return new Promise((resolve, reject) => {
console.log('task1 done.', TSTaskID);
resolve(TSTaskID)
})
/** implementation */
};
const task2 = async (TSTaskID) => {
return new Promise((resolve, reject) => {
console.log('task2 done.', TSTaskID);
resolve(TSTaskID)
})
/** implementation */
};
const task3 = async (TSTaskID) => {
return new Promise((resolve, reject) => {
console.log('task3 done.', TSTaskID);
resolve(TSTaskID);
})
/** implementation */
};
這樣做時的日志
LOG task1 done. 1638938895
LOG task1 done. 1638945283
LOG task2 done. 1638938895
LOG task2 done. 1638945283
LOG task3 done. 1638938895
LOG task3 done. 1638945283
我想要它的樣子
LOG task1 done. 1638938895
LOG task2 done. 1638938895
LOG task3 done. 1638938895
LOG task1 done. 1638945283
LOG task2 done. 1638945283
LOG task3 done. 1638945283
我已經嘗試了幾種使用方法,async function但任務仍然沒有按順序完成。就像任務 1、2、3 相同編號,下一個任務編號相同。因為我需要檢查服務器資料庫并更新本地 SQLite 表。因此,它需要等待一個完成才能繼續下一步。
uj5u.com熱心網友回復:
映射時,task1 的兩個初始 Promise 都會被觸發。在開始第二個之前,您需要等待第一個完成。例如
const callTasks = async (response) => {
const result = []
for(let i = 0; i < response.length; i ){
const current = response[i]
try {
const result1 = await task1()
const result2 = await task2(result1)
const result3 = await task3(result3)
result.push(result1)
} catch(e) {
// catch here
}
}
return result
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/376397.html
標籤:javascript
