2015-04-20 33 views
2

目前我已經開始爲Office 2013開發一些應用程序。要開發這些應用程序,我正在使用office.js,它可以用於例如Excel工作表。使用承諾模式使用office.js

大多數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 
}); 

我不喜歡這種類型的異步編程的。相反我更喜歡使用承諾,寫類似:

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

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

回答

0

解決這個問題的最簡單形式是用自定義的解決承諾的回調替換回調。請注意,下面的實現使用ES6承諾其在Chrome中可用:

 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 
     }); 
+0

謝謝,但我不使用ES 6.我正在尋找一個更簡單的方法,也許一個圖書館,使這發生。像新版本的jQuery,它支持ajax調用的promise模式。 – mehrandvd

+0

你可以用你喜歡的任何東西代替承諾。如果沒有這樣的圖書館,那麼你應該考慮自己做。 –

+0

解決方案始終是單一的事情。 –

1

沒問題 - 這個例子是使用the bluebird承諾庫。基本上,我們是一個回調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 
});