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

标签 javascript asynchronous promise ms-office office-js

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

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

相关文章:

javascript - 页面跳转到顶部onclick

javascript - Cordova WP8 - 推送通知回调

javascript - 向下滚动然后向上滚动时如何隐藏div

java - void @Async 方法的单元测试用例

asynchronous - Winsock 异步多个 WSASend 与一个缓冲区

javascript - 如何使用promise.all使用mysql insert来级联样式?

javascript - API 距离矩阵单独在 Javascript 中调用

python - 进程的异步生成 : design question - Celery or Twisted

JavaScript Promise.all 代码未按预期工作

javascript - 等待异步递归函数完成,然后再继续执行下一行代码