0

私の問題に関連していると思われるdeferred、 、donepromiseおよびなど の多くの投稿を読んで一日を過ごしました。callbacks'how do i run function_2 after function_1'

したがって、物事が非同期で発生した場合、上記のアプローチのいずれかで具体的に処理する必要があるという概念を理解しています。

私のシナリオでは、ループと関数 function_1が含まれています。$.each()on.("load"...)

function_2終わったら走りたいfunction_1

私が単に呼び出すと:

function_1();
function_2();

それらは順番に実行されません。私は、またはどちら$.eachon.("load"...)が非同期で動作するためだと推測しています。

私が電話しようとするfunction_2と:

function_1.done(function_2());

私は得る:

TypeError: function_1.done is not a function.

function_1これにより、その方法が利用できない と考えるようになります (そして、この時点で完全に軌道から外れている可能性があります)。

したがって、私の質問は、おそらく誤った仮定に基づいていますが、次のとおりです。

  • どのタイプのオブジェクトから返されますかfunction_1(含まれている場合は$.each()機能しon.("load"...)ますか?
  • メソッドfunction_1が利用可能であることを強制できますか?done()

jsフィドル

を使用した上記のアプローチと同様に、動作しないdone()acallbackを使用してみましたが、おそらく時間がかかるものを複製する私の方法は正しくありませんでした:

http://jsfiddle.net/rwone/xFX8a/2/

// function 1
function function_1(callback) {
// replicating something that takes a while
// alert("1");
setTimeout(function() {
$("p").append("This should happen first.");
}, 300);
callback();
}

//function 2
// only do this when function one has finished
function function_2() {
alert("This should happen second.");   
};

// the call
function_1(function_2);
4

1 に答える 1

1

間違った場所でコールバックを呼び出していることを除いて、コールバック ソリューションは完全に機能します。

// function 1
function function_1(callback) {
    // replicating something that takes a while
    // alert("1");
    setTimeout(function() {
        $("p").append("This should happen first.");
        callback(); // <=== Here, when the thing is done
    }, 300);
    // callback();  // <=== Not here, when you've only started it and it's not done yet
}

明示的なコールバックの代わりにプロミスを使用したい場合は、それも可能です。Promise は JavaScript 言語の一部ではありません。JavaScript 関数はそれ自体で promise を利用可能にしないため、機能しませんでしfunction_1.doneた。promise を (オブジェクトの形式で jQuery を使用して) 作成し、それDeferredを関数から返し、それを他の関数で使用します。

// function 1
function function_1() {
    var d = new $.Deferred();

    setTimeout(function() {
        $("p").append("This should happen first.");
        d.resolve();    // <=== Resolve the deferred, now that the action is complete
    }, 300);
    return d.promise(); // <=== Return the Promise for the Deferred
}

//function 2
// only do this when function one has finished
function function_2() {
    alert("This should happen second.");   
};

// the call
function_1().done(function_2);
于 2014-02-02T10:21:34.413 に答える