1

Windows 8 JavaScript アプリで作業していますが、WinJS.Promise が期待どおりに機能しません。これが私の非同期メソッドです...

function MyFiveSecondFunctionAsync() {
    return new WinJS.Promise(function (c, e, p) {
        var start = new Date().getTime();
        var delay = 5000;
        while (new Date().getTime() < start + delay) p();
        c();
    });
}

そして、これが私がそれを呼んでいるものです...

document.querySelector("#status").innerText = "working";
MyFiveSecondFunctionAsync().done(function () {
    document.querySelector("#status").innerText = "done";
});
document.querySelector("#status").innerText = "free";

これはボタンクリックです。ボタンをクリックした後、ステータス div が「作業中」と非常に短く言うことを期待しますが、5 秒間「無料」と言い、5 秒の遅延が完了すると最後に「完了」と言うでしょう。代わりに、UI スレッドが 5 秒間ブロックされ、ステータス div に「free」と表示されます。

ステータスを「free」にする行まで実行が戻ると思っていたのですが、デバッグするとその前にpromise関数にヒットしていることが分かります。そのため、ステータスは 5 秒後に「完了」に設定され、その後「無料」に設定されます。言い換えれば、私の非同期関数は単に非同期的に動作していません。

4

1 に答える 1

3

レイモンドがコメントで述べたように、私は約束がそうではない新しいスレッドを作成するだろうと思っていました。promiseは、コールバック関数を指定し、ネストされたコールバックのクリスマスツリーの問題に入る可能性がある代わりに、「何か他のことが行われたときに何かを行う」ための便利な方法を提供するだけです。

于 2012-06-27T17:40:06.067 に答える