为了账号安全,请及时绑定邮箱和手机立即绑定

异步后如何调用同步代码

异步后如何调用同步代码

森栏 2022-12-02 16:54:18
我有一个函数sumFileSizes(),它接受两个文件的名称并调用在第三个参数中传递的函数,并将它们的大小之和作为第一个参数传递给它。有一个异步函数来获取文件 ramzer getFileSize()。function getFileSize(filename, cb) {  setTimeout(() => cb(fileSizes[filename]), Math.random() * 500);}function sumFileSizes(filename1, filename2, cb) {    const sum = getFileSize(filename1, cb) + getFileSize(filename2, cb);    setTimeout(cb(sum), Math.random() * 550)}处理后如何调用回调const sum = getFileSize(filename1, cb) + getFileSize(filename2, cb);?
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

您可以promisify使用您的代码,然后使用async..await.


function getFileSize(filename) {

  return new Promise((resolve) => {

    setTimeout(() => resolve((fileSizes[filename])), Math.random() * 500);

  });

}


async function sumFileSizes(filename1, filename2) {

    const size1 = await getFileSize(filename1, cb);

    const size2 = await getFileSize(filename2, cb);

    return size1 + size2;

}

请注意,异步函数返回一个promise,因此您需要执行以下操作:


sumFileSize(filename1, filename2).then(cb); // cb is callback function

另请注意,这async..await是一项新功能,在旧版浏览器中将不支持。您可能必须使用转译器babel来转换 ES5 中的代码。


查看完整回答
反对 回复 2022-12-02
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

使用承诺,等待/异步


// Work to do

const work = (param) => {

  return new Promise((resolve, reject) => {

    // Do some time consuming stuff

    setTimeout(() => {

      // When done, resolve

      resolve(param * param);

    }, 3000);

  });

}


// Run async function

(async () => {

  // Run worker and wait till finish

  const result = await work(3);

  

  // Use result

  const finalResult = result * 2;

  

  // Log

  console.log(finalResult);

})();


查看完整回答
反对 回复 2022-12-02
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

getFileSize(filename1, (value1) => {

    getFileSize(filename2, (value2) => {

      callback(value1 + value2)

    })

})


查看完整回答
反对 回复 2022-12-02
  • 3 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信