gpt4 book ai didi

javascript - 从 Promise : callback or promise? 返回一个值

转载 作者:行者123 更新时间:2023-12-02 14:29:52 25 4
gpt4 key购买 nike

(*我修改了我最初的问题...*)

我有一个异步函数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.runctx.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com