扫码关注官方订阅号
如下图
这样一个树形结构的异步树。该怎么写才能保证每个异步操作依次等待执行。
即上一个操作完成之后再执行下一个,后一个执行可能会用到前一个执行的返回结果。
ringa_lee
可以用Promise实现。每个任务的结果用一个Promise保存,如果A依赖B则在B resolve之后才开始A.
const tasks = { a: { dep: ["b", "c"], run: (resultB, resultC) => resultB + resultC }, b: { run: () => `B` }, c: { dep: ["d"], run: resultD => `C` + resultD }, d: { run: () => `D` }, }; const targetStack = []; function run(taskTree, target, results = {}) { if (targetStack.indexOf(target) !== -1) { const err = new Error(`recursive dependicies: ${targetStack.concat([target]).join(" <- ")}`); targetStack.length = 0; throw err; } targetStack.push(target); const deps = (taskTree[target].dep || []).map( depName => results[depName] = results[depName] || run(taskTree, depName, results) ); targetStack.pop(); return Promise.all(deps).then(deps => taskTree[target].run.apply(undefined, deps)); } run(tasks, "a").then(resultA => console.log(resultA));
(这个代码其实不需要任务是树形,只要求是无环图)
var p1 = new Promise(function (resolve, reject) { // ... }); var p2 = new Promise(function (resolve, reject) { // ... resolve(p1); })
这样p2就会在p1之后执行了。可参考:promise
就是实现一个promise的polyfill么。可以看看一个非常精简的代买实现 promise-lie如果有看不明白的地方可以交流。
promise
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
可以用Promise实现。每个任务的结果用一个Promise保存,如果A依赖B则在B resolve之后才开始A.
(这个代码其实不需要任务是树形,只要求是无环图)
这样p2就会在p1之后执行了。
可参考:promise
就是实现一个
promise的polyfill么。可以看看一个非常精简的代买实现 promise-lie如果有看不明白的地方可以交流。