簡體   English   中英

使用promise模式使用office.js

[英]Working with office.js using promise pattern

目前我已經開始開發Office 2013的一些應用程序 要開發這些應用程序,我使用的是office.js ,它可以用來處理Excel工作表。

大多數API都是這樣的:

document.getSelectedDataAsync(p1, p2, function(asyncResult)
{
    if (asyncResult.status == 'success')
        // do something with asyncResult.value
    else if (asyncResult.status == 'fail')
        // show asyncResult.error as Error
});

我不喜歡這種類型的異步編程。 相反,我更喜歡使用promises並寫下類似的東西:

document.getSelectedDataAsync(p1, p2)
    .done(function(result)
    {
        // do something with result
    })
    .fail(function(error)
    {
        // show error message 
    })

有沒有辦法像上面的承諾一樣使用office.js API?

當然 - 這個例子是使用bluebird promise庫。 基本上,我們將回調API轉換為承諾:

function promisify(fn){ // take a function and return a promise version
     return function(){
          var args = [].slice.call(arguments);
          return new Promise(function(resolve, reject){
               args.push(function(asyncResult){
                    if(asyncResult.status === 'success') resolve(asyncResult.value);
                    else reject(asyncResult.error);
               }); 
               fn.apply(this, args); // call function   
          }.bind(this)); // fixate `this`
     };
}

這可以讓你做類似的事情:

document.getSelectedDataPromise = promisify(document.getSelectedDataAsync);
document.getSelectedDataPromise(p1, p2).then(function(result){
   // do something with result
}).catch(function(err){
   // handle error
});

最簡單的解決方法是將回調替換為解決承諾的自定義回調。 請注意,以下實現使用Chrome中提供的ES6承諾:

        function toPromise () {
            var args = Array.prototype.slice.call(arguments);
            var self = this;
            return new Promise(function (reject, resolve) {
                var callback = function () {
                    if (arguments[0] instanceof Error) {
                        return reject.apply(null, arguments);
                    }

                    resolve.apply(arguments);
                };

                args.push(callback);
                self.apply(self, args);
            });
        }

        Function.prototype.toPromise = toPromise;

        document.getSelectedDataAsync.toPromise(p1, p2).then(function () {
            //success
        }).catch(function () {
            //error
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM