Javascript 使用承诺模式使用office.js
目前,我已经开始为Office 2013开发一些应用程序。为了开发这些应用程序,我正在使用office.js(例如,它设计用于Excel工作表) 大多数API类似于:Javascript 使用承诺模式使用office.js,javascript,promise,office-2013,office-app,Javascript,Promise,Office 2013,Office App,目前,我已经开始为Office 2013开发一些应用程序。为了开发这些应用程序,我正在使用office.js(例如,它设计用于Excel工作表) 大多数API类似于: document.getSelectedDataAsync(p1, p2, function(asyncResult) { if (asyncResult.status == 'success') // do something with asyncResult.value else if (asy
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
})
document.getSelectedDataPromise = promisify(document.getSelectedDataAsync);
document.getSelectedDataPromise(p1, p2).then(function(result){
// do something with result
}).catch(function(err){
// handle error
});
有没有办法使用office.js API使用上述承诺?解决这一问题的最简单方式是用解决承诺的自定义回调替换回调。请注意,以下实现使用了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
});
当然,这个例子使用的是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.getSelectedDataAsync(p1, p2)
.done(function(result)
{
// do something with result
})
.fail(function(error)
{
// show error message
})
document.getSelectedDataPromise = promisify(document.getSelectedDataAsync);
document.getSelectedDataPromise(p1, p2).then(function(result){
// do something with result
}).catch(function(err){
// handle error
});
谢谢,但我不使用ES 6。我正在寻找一个更简单的方法,也许是一个图书馆让这一切发生了。比如jQuery的新版本,它支持ajax调用的承诺模式。您可以用任何您喜欢的方式替换承诺。如果没有这样的图书馆,那么你应该考虑自己动手。决议总是一件事。