javascript - 努力实现 promise

标签 javascript promise es6-promise

我有两个功能。第一个是运行一定时间的 animationFunction()。第二个是 parentFunction(),它需要在 animationFunction() 停止循环后运行一个名为 dispatch() 的函数。 dispatch() 只能从父函数调用:

const animationFunction = (args) => {
  const duration = 1000;

  //init animation function stuff...

  //draw loop
  const loop = drawLoop(({ time }) => {
    if (time > duration) {
      loop.stop();
    }
  });
};

const parentFunction = () => {
  animationFunction(args);
  //dispatch be run after animationFunction is done looping
  dispatch(); 
}

我认为animationFunction()可以被认为是异步的,因为它需要一定的时间来循环,然后程序才能继续。我找到了一种使用回调让 dispatch()animationFunction() 完成循环后在父函数中运行的方法,但我对如何使用基于 promise 的实现。这是我的回调解决方案:

const animationFunction = (args, callback) => {
  const duration = 1000;

  //init animation function stuff...

  //draw loop
  const loop = drawLoop(({ time }) => {
    if (time > duration) {
      loop.stop();
      callback();
    }
  });
};

const parentFunction = () => {
  animationFunction(args, () => {
    //dispatch should be run after animationFunction is done looping
    dispatch();
  }); 
}

我对基于 Promise 的解决方案感到困惑。我尝试这样做:

const animationFunction = (args) => {
  const duration = 1000;

  //init animation function stuff...

  //draw loop
  const loop = drawLoop(({ time }) => {
    if (time > duration) {
      loop.stop();
      return new Promise((resolve, reject) => {
        resolve();
      });
    }
  });
};

const parentFunction = () => {
  animationFunction(args).then(() => {
    dispatch();
  });
}

但这似乎不起作用。我做错了什么?

最佳答案

您不会将 promise 返回给 animationFunction 的调用者,而是返回给可能未处理的 drawLoop 范围(很难从您的示例中看出,因为大多数代码丢失)。

相反,从 animationFunction 返回一个 promise ,并在计时器到时解决它。这是一个最小的、可重现的示例:

const animationFunction = () => {
  const duration = 10;
  let ticks = 0;
  return new Promise((resolve, reject) => {
    (function update() {
      console.log(ticks++);

      if (ticks >= duration) {
        return resolve("some optional data");
      }

      requestAnimationFrame(update);
    })();
  });
};

animationFunction().then(data => {
  console.log("dispatched: " + data);
});

关于javascript - 努力实现 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61534648/

相关文章:

javascript - 如何在 laravel javascript 中设置默认事件选项卡?

javascript - 在 TinyMCE 中输入时在字符前添加空格

javascript - 混淆 error 和 reject in Promise

javascript - 如何在 "AND"关系中组合 deferreds/promise,但不将单个拒绝计为整体拒绝?

node.js - 可能在 NodeJS、JXcore 等下运行的代码如何检测它是否在支持原生 ES6 Promise 的环境中运行?

javascript - 使用 Electron 在本地保存文件

javascript - 为什么我的队列可以正常工作而不会出列?

javascript - 在 node.js 中使用 Q Promises 链接 GET 请求

javascript - 嵌套 Axios 调用仅将第一个值返回到数组

javascript - Promise 在解决之前被过早拒绝多次