(* Я изменил свой первоначальный вопрос... *)
У меня есть асинхронная функция calculate
, которая пересчитывает книгу Excel и печатает, сколько времени это занимает.
Затем я хочу, чтобы функция возвращала время расчета, чтобы я мог его записать. Это касается того, чтобы асинхронная функция возвращала значение. Я прочитал несколько тем и пишу следующие 2 способа, которые работают:
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)
) в нужном месте, или я должен обернуть его другим then
?
PS: Excel.run
и ctx.sync()
— это функции JavaScript. API для офиса; они оба возвращают обещание.
t
, чего вы и хотите. - person Deepak Puthraya   schedule 21.06.2016