在ThingsBoard中如何在for循环中实现Promise同步执行
依赖式API调用的同步执行解决方案
我需要在for循环中调用6个ThingsBoard内置API,每个API调用必须依赖前一个的执行结果。尝试同步执行这些调用时,因为各API响应时间不一致,没法实现真正的顺序执行。
原代码示例:
for (let i = 0; i < 2; i++) { let promise1 = new Promise((resolve, reject) => { resolve("Promise 1 "); }); let promise2 = new Promise((resolve, reject) => { setTimeout(() => { resolve("Promise 2"); }, 1000); }); let promise3 = new Promise((resolve, reject) => { setTimeout(() => { resolve("Promise 3"); }, 2000); }); let promiseExecution = async () => { for (let promise of [promise2, promise3, promise1]) { // console.log('promise',promise) try { const message = promise; console.log(message); } catch (error) { console.log(error.message); } } }; promiseExecution(); }
预期输出:
Promise 2 Promise 3 Promise 1 Promise 2 Promise 3 Promise 1
问题分析
原代码的核心问题有两个:
- 直接创建Promise对象时,这些Promise会立即开始执行,不是在遍历的时候才触发,没法保证顺序依赖
- 遍历过程中没有用
await等待Promise完成,只是打印了Promise对象本身,不是resolve后的结果
解决方案
要实现真正的顺序同步执行,需要做两个关键调整:
- 将每个API调用(或模拟的Promise)封装成函数,只有调用函数时才会创建并执行Promise,这样能控制执行时机
- 在async函数中遍历这些函数,用
await等待每个Promise完成后再执行下一个,确保依赖关系 - 外层循环如果需要顺序执行多次,也要用
await避免并发
修改后的代码示例
// 把每个Promise封装成函数,调用时才执行 const getPromise1 = () => new Promise((resolve) => { resolve("Promise 1 "); }); const getPromise2 = () => new Promise((resolve) => { setTimeout(() => { resolve("Promise 2"); }, 1000); }); const getPromise3 = () => new Promise((resolve) => { setTimeout(() => { resolve("Promise 3"); }, 2000); }); // 用数组维护执行顺序的函数列表 const promiseFunctions = [getPromise2, getPromise3, getPromise1]; // 单轮顺序执行逻辑 const executeInOrder = async () => { for (const fn of promiseFunctions) { const result = await fn(); console.log(result); } }; // 外层循环顺序执行两次 const runLoop = async () => { for (let i = 0; i < 2; i++) { await executeInOrder(); } }; runLoop();
这样修改后,就能严格按照Promise2 → Promise3 → Promise1的顺序执行,两次循环也会依次完成,输出和预期完全一致。
内容的提问来源于stack exchange,提问作者user22536823
相关产品推荐
相关产品推荐

