2

これが私がやりたいことです:

setSource は約 3 秒間実行される関数です。

 editor.setSource();

 setTimeout(function () {
      //do something, some commands
 }, 3000);

setSource() の最後の行が実行された後に、//何かを実行したいのですが、いくつかのコマンド部分が実行されます。今はsetTimeoutでやっていますが、setSource()の実行に5秒かかることがあるので、あまり良い解決策ではないと思います。これを行う方法?

4

3 に答える 3

7

setSourceコールバック引数を取ります:

editor.setSource = function(callback) {
    // do editor things
    callback();
}

次に、実行するコードの次のブロックをコールバックとして渡します。

editor.setSource(function() {
    // do some other things
});

jQuery の遅延オブジェクトにアクセスできる場合は、ここでそれらを利用できます。

  1. 新しい遅延オブジェクトを作成します。
  2. タイムアウトを開始して、長いタスクを実行します。
  3. 遅延オブジェクトを返します。
  4. タイムアウトで、タスクが完了したら、 を呼び出しますdeferred.resolve

 

editor = {
    setSource: function() {
        var deferred = $.Deferred();

        console.log("Beginning editor.setSource...");

        setTimeout(function() {
            // This function took a while to occur
            deferred.resolve();
        }, 3000);

        return deferred;
    }
}

$.when(editor.setSource()).then(function() {
    console.log("Editor is done!");
});

AJAX、アニメーション、または遅延オブジェクトを使用する別の jQuery タスクを既に実行している場合は、独自の遅延オブジェクトを作成する代わりに、その結​​果の値を返すことができます。

editor = {
    setSource: function() {
        return $.get({
            url: "myurl.com/mypage",
            data: $("#myform").serialize()
        });
    }
}

$.when(editor.setSource()).then(function() {
    console.log("Editor is done!");
});

遅延オブジェクトを解決または拒否する方法と、それらの処理方法を確認してください。

于 2013-03-12T11:53:24.167 に答える
3

この回答ではpromisesECMAScript 6標準の JavaScript 機能である を使用しています。ターゲット プラットフォームが をサポートしていない場合はpromises、PromiseJs でポリフィルします。

新しいブラウザ バージョンでは、ES6 promises. editor.setSource()実行を a にラップしてPromise返すので、他の関数で続行できます。

editor.setSource = function(){
    return new Promise(function(fulfill, reject){
        //do your work
        fulfill(resultValue);
    });
};

別の関数でそれを続けるにはthen、promise でメソッドを使用するだけです。

var promise = editor.setSource();
promise.then(function(result){
    //do something more
});
于 2015-09-23T07:43:32.393 に答える