异步后如何调用同步代码

时间:2020-07-23 18:58:21

标签: javascript

我有一个函数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 个答案:

答案 0 :(得分:0)

使用承诺,等待/异步

// 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);
})();

答案 1 :(得分:0)

您可以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中的代码。

答案 2 :(得分:-1)

getFileSize(filename1, (value1) => {
    getFileSize(filename2, (value2) => {
      callback(value1 + value2)
    })
})