当前位置: 首页 > 知识库问答 >
问题:

javascript - js回调写法如何转为Promise?

乌靖
2023-07-19
function test(flag, cb) {  cb(flag)  console.log('finish')}

cb是回调函数,我想要先执行cb,再执行后面test中一些逻辑
这个如何改为Promise写法,不使用setTimeoutrequestAnimationFrame
能得到下面的使用效果

test2(false).then(flag => {  console.log('cb call')})// -> cb call// -> finish

共有4个答案

闻人花蜂
2023-07-19
function test2(flag) {  return {    then: function (cb) {      return new Promise(function (resolve, reject) {        try {          cb();          console.log('finish');          resolve();        } catch (e) {          reject(e);        }      });    }  }}(async function () {  await test2(false).then(() => {    console.log('cb call');  });})();

then还是改名before更好

支劲
2023-07-19
function cb(flag) {  return new Promise((resolve)=>{    setTimeout(()=>{      console.log(flag) // 这行代码不能是异步的      resolve()    },1000)  })}async function test(flag, cb) {  await cb(flag)  console.log('finish')}function test2(flag,cb){  cb(flag).then(()=>{    console.log('finish')  })}test('sss', cb)

不太确定你的需求,按我的理解,如果你需要执行异步的cb再执行finish,那就要在cb中使用promise,提供一个写法,test和test2效果是一样的。

米项禹
2023-07-19

返回一个 promise 就好了呀。

function test(flag) {  return new Promise((resolve, reject) => {    setTimeout(() => flag ? resolve(flag) : reject(flag), 2000)  })}test(true).then(res => {  console.log('test.then =>', res)}).catch(err => {  console.log('test.catch =>', err)})

Edit

没完整看完问题描述,你这个就是没有正确理解 链式调用 才会提出来的问题呀。
所以其实你需要 Promisify 的其实是 cb 这个函数,而不是 test 这个函数啊。

单喜
2023-07-19

很简单,把你本该写回调的地方,写上promise的resolve即可

function test(flag) {  return new Promise(resolve => {    resolve(flag)    console.log('finish')  })}

但是你希望执行完cb call再执行finish
这根本不是promise可以解决的场景
因为resolve那会进入微任务
console.log('finish')那儿不会等待因resolve之后触发then里回调执行完再执行

 类似资料:
  • 问题内容: 我想使用Promise,但是我有一个类似以下格式的回调API: 1. DOM加载或其他一次事件: 2.普通回调: 3.节点样式回调(“ nodeback”): 4.带有节点样式回调的整个库: 如何在Promise中使用API​​,如何“承诺”呢? 问题答案: 承诺具有状态,它们从待定状态开始,可以解决: fulfilled成 意味着计算成功完成。 fulfilled 表示计算失败。 承

  • 问题内容: 我正在使用播放框架和Apache Kafka。 我有一个POST方法,它将消息发送到Kafka。Kafka有一个API方法 public java.util.concurrent.Future send(ProducerRecord记录,回调回调) 其中Javadoc说 异步将记录发送到主题,并在确认发送后调用提供的回调。 我正在使用play框架公开此功能。我想从Controller方

  • 我正在使用play框架和Apache Kafka。 我有一个POST方法,它向Kafka发送消息。Kafka有一个API方法 公共java.util.concurrent。未来发送(生产记录记录、回调) 其中Javadoc说 异步发送记录到主题,并在发送被确认时调用提供的回调。 我将使用play框架公开此功能。我想返回一个<代码>promise

  • 问题内容: 我想使用Promise,但是我有一个类似以下格式的回调API: 1. DOM加载或其他一次事件: 2.普通回调: 3.节点样式回调(“ nodeback”): 4.带有节点样式回调的整个库: 如何在promise中使用API​​,如何“承诺”它? 问题答案: 承诺有状态,它们从待定状态开始,可以解决: 完成 意味着计算成功完成。 拒绝 表示计算失败。 承诺返回函数 绝不应该抛出,而应该

  • 问题内容: 以下函数从url获取图像并进行加载,然后返回其宽度和高度: 问题是,如果我做这样的事情: 我得到,因为该函数运行但图像尚未加载。 仅当照片已加载且宽度和高度已可用时,如何使用等待/异步返回值? 问题答案: 如何使用/ 将此回调函数转换为Promise? 你不知道与往常一样,您可以使用构造函数。没有语法糖。 仅当照片已加载且宽度和高度已经可用时,如何使用/ 记录值? 你可以做

  • 我现在是将方法A定义在被写入的文件里,然后 {a:'${A}'},在写入之前将'${}',给删了;但有没有简洁一点的方法呢? process 如何编写?