(*我修改了最初的問題。*)從承諾中回報價值:回調或承諾?
我有一個異步函數calculate
從而重新計算Excel工作簿和打印需要多長時間。
然後,我想讓函數返回計算時間,以便我可以記錄它。它認爲使一個異步函數返回一個值。我看過幾個線程,並編寫以下2種方式,其工作:
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)
)在正確的地方,或者我應該包裝在另一個then
?
PS:Excel.run
和ctx.sync()
是JavaScript API for Office的功能;他們都回報了一個承諾。
乘坐看看這個http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it。您正在混合回調和承諾。我建議讓計算解決't',這是你想要的。 – Putty
我最初的回調方式沒有錯(錯誤信息是由於其他原因)。請看我的更新... – SoftTimur
你更喜歡的是「更好」。 – zerkms