我有一个函数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);
之后如何调用回调?
答案 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)
})
})