1. // 写一个 machine 函数达到如下效果
    2. function machine() {}
    3. machine('ygy').execute();
    4. // start ygy
    5. machine('ygy')
    6. .do('eat')
    7. .execute();
    8. // start ygy
    9. // ygy eat
    10. machine('ygy')
    11. .wait(5)
    12. .do('eat')
    13. .execute();
    14. // start ygy
    15. // wait 5s(这里等待了5s)
    16. // ygy eat
    17. machine('ygy')
    18. .waitFirst(5)
    19. .do('eat')
    20. .execute();
    21. // wait 5s
    22. // start ygy
    23. // ygy eat
    1. // 基于首次答案有微调
    2. const defer = sec => new Promise(resolve => setTimeout(resolve, sec * 1000));
    3. function machine(name) {
    4. const tasks = [];
    5. const initTask = () => {
    6. console.log(`start ${name}`);
    7. };
    8. tasks.push(initTask);
    9. function _do(str) {
    10. const task = () => {
    11. console.log(`${name} ${str}`);
    12. };
    13. tasks.push(task);
    14. return this;
    15. }
    16. function wait(sec) {
    17. const task = async () => {
    18. console.log(`wait ${sec}s`);
    19. await defer(sec);
    20. };
    21. tasks.push(task);
    22. return this;
    23. }
    24. function waitFirst(sec) {
    25. const task = async () => {
    26. console.log(`wait ${sec}s`);
    27. await defer(sec);
    28. };
    29. tasks.unshift(task);
    30. return this;
    31. }
    32. function execute() {
    33. tasks.reduce(async (promise, task) => {
    34. await promise;
    35. await task();
    36. }, undefined);
    37. }
    38. return {
    39. do: _do,
    40. wait,
    41. waitFirst,
    42. execute,
    43. };
    44. }
    1. const defer = sec => new Promise(resolve => setTimeout(resolve, sec * 1000));
    2. function machine(name) {
    3. const context = {};
    4. const tasks = [];
    5. const initTask = () => {
    6. console.log(`start ${name}`);
    7. };
    8. tasks.push(initTask);
    9. function _do(str) {
    10. const task = () => {
    11. console.log(`${name} ${str}`);
    12. };
    13. tasks.push(task);
    14. return context;
    15. }
    16. function wait(sec) {
    17. const task = async () => {
    18. console.log(`wait ${sec}s`);
    19. await defer(sec);
    20. };
    21. tasks.push(task);
    22. return context;
    23. }
    24. function waitFirst(sec) {
    25. const task = async () => {
    26. console.log(`wait ${sec}s`);
    27. await defer(sec);
    28. };
    29. tasks.unshift(task);
    30. return context;
    31. }
    32. function execute() {
    33. tasks.reduce(async (promise, task) => {
    34. await promise;
    35. await task();
    36. }, undefined);
    37. }
    38. // 用 Object.freeze 来防止调用者修改内部函数,保障安全
    39. return Object.freeze(
    40. Object.assign(context, {
    41. do: _do,
    42. wait,
    43. waitFirst,
    44. execute,
    45. })
    46. );
    47. }

    作者:serialcoder
    链接:https://juejin.im/post/5c92dfe7f265da60d428f119
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。