(*我修改了我最初的问题...*)
我有一个异步函数calculate
,它可以重新计算 Excel 工作簿并打印所需的时间。
然后,我想让函数返回计算时间,以便我可以记录它。它涉及使异步函数返回一个值。我读了几个线程,并写了以下两种有效的方法:
function calculate1 (mode, fn) {
return Excel.run(function (ctx) {
ctx.workbook.application.calculate(mode);
var before = performance.now();
return ctx.sync().then(function() {
var after = performance.now();
var t = after - before;
document.getElementById("b").value += 'inside: ' + t + '\n';
fn(t);
})
})
}
function calculate2 (mode) {
return new Promise(function (resolve, reject) {
return Excel.run(function (ctx) {
ctx.workbook.application.calculate(mode);
var before = performance.now();
return ctx.sync().then(function() {
var after = performance.now();
var t = after - before;
document.getElementById("b").value += 'inside: ' + t + '\n';
resolve(t); })
})
})
}
这是测试:
function test () {
var a = [];
var pm = new OfficeExtension.Promise(function(resolve, reject) { resolve (null); });
pm
.then(function() { return calculate1('FullRebuild', function (t) {
a.push(t); }); })
.then(function() { return calculate1('FullRebuild', function (t) {
a.push(t); }); })
.then(function() { return calculate2('FullRebuild').then(function (result) {
a.push(result); }); })
.then(function() { return calculate2('FullRebuild').then(function (result) {
a.push(result); }); })
.then(function() {
document.getElementById("b").value += a.toString() + '\n'; });
}
我猜calculate1
使用callback
,而calculate2
使用promise
。谁能告诉我哪种方法更好?
此外,fn(t)
(分别为resolve(t)
)是否位于正确的位置,或者我应该将其包装在另一个然后
?
PS:Excel.run
和ctx.sync()
是JavaScript API for Office的函数;他们都返回一个 promise 。
最佳答案
calculate1()
是 promise 和回调的糟糕组合,而 calculate2()
则展示了 Explicit Promise Construction Antipattern .
以下是如何正确使用 Promise 而不会产生任何额外浪费的方法:
function calculate1 (mode) {
return Excel.run(function (ctx) {
ctx.workbook.application.calculate(mode);
var before = performance.now();
return ctx.sync().then(function() {
var after = performance.now();
var t = after - before;
document.getElementById("b").value += 'inside: ' + t + '\n';
return t;
});
});
}
然后你就可以像这样消费它了。请注意,它使用的函数比您尝试的要少得多:
return calculate1('FullRebuild')
.then(function(res) {
a.push(res);
return calculate1('FullRebuild');
})
.then(function(res) {
a.push(res);
return calculate1('FullRebuild');
})
.then(function(res) {
a.push(res);
return calculate1('FullRebuild');
})
.then(function(res) {
a.push(res);
document.getElementById("b").value += a.toString() + '\n';
});
关于javascript - 从 Promise : callback or promise? 返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37936450/