(*私の最初の質問を修正しました。*)約束から値を返す:コールバックまたは約束?
私はExcelワークブックを再計算し、所要時間をプリントする非同期関数calculate
を持っています。
次に、私はそれを記録できるように、計算時間を返す関数を作りたいと思います。非同期関数が値を返すようにします。私は仕事、次の2つの方法を、複数のスレッドを読んで、書き込み:calculate2
はpromise
を使用している間、私はcalculate1
がcallback
を使用して推測
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'; });
}
:ここ
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); })
})
})
}
はテストです。誰がもっと良い方法を教えてもらえますか?
また、適切な場所にfn(t)
(resp。、resolve(t)
)と書かれていますか、別のthen
に貼り付ける必要がありますか?
PS:Excel.run
およびctx.sync()
は、JavaScript API for Officeの機能です。彼らは両方とも約束を返す。
を取るブロック -
約束の利便性は、それがコールバックのネストを回避していることですこれを見てくださいhttp://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it。コールバックと約束をミックスしています。あなたが望むものを解決する 't'を計算させることをお勧めします。 – Putty
私の初期のコールバックによる方法は間違っていませんでした(エラーメッセージは何か他のものが原因でした)。私の更新を見てください... – SoftTimur
あなたが好きなものは「より良い」ものです。 – zerkms