在javascript中使用promise映射数组时顺序



我不得不问,因为我找不到一个合适的方法来解决它。我遵循了《如何依次解决JavaScript承诺》中的教程(一个接一个(,但在我改变它后,它仍然无法解决我的情况。

我调用了一个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表。所以,它需要等待一个完成,然后再继续下一个。

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(result2)
result.push(result3)
} catch(e) {
// catch here
}
}
return result
} 

最新更新