0

私の問題が何であるかを示す例を作成しました。コードを投稿してから説明します。

私のJS:

$('#mybtn').on('click', function(){
//$(fn1).promise().done(fn2);
$.Deferred(fn1).then(fn2);
});

function fn1(){
    console.log("1");
            $.ajax({
            url: 'ajax.php',
            type: 'POST',
            data: {
                func: "1"
            },
            success: function(data){
                console.log(data);
            }
        });
}

function fn2(){
    console.log("2");
            $.ajax({
            url: 'ajax.php',
            type: 'POST',
            data: {
                func: "2"
            },
            success: function(data){
                console.log(data);
            }
        });
}

私のPHP:

<?php
$request = $_POST['func'];

    switch ($request) {
        case '1':
            fn1();
            break;
        case '2':
            fn2();
            break;                  
    }

    function fn1(){
        print "1";
        sleep(4);
    }

    function fn2(){
        print "2";  
        sleep(2);
    }

?>

だから、私は関数を呼び出してそれらが終了するのを待つためにこれらの2つの方法を試しました。$.Deferred(fn1).then(fn2); は 1, 2 の次に 2, 1 を出力します。1、1を出力して停止します。fn2を呼び出すことさえしないでください。出力したいのは1、1、2、2です。変数でajaxリクエストを返す問題を解決し、promise().doneを使用するだけですしかし、それはできません。関数を変更せずに待つ必要があります。それは可能ですか? 私はこのように意味します:

    toWait.someWayToWait().then(anotherFunctionToWait());

    function toWait(){
        //whatever code or functions in here.
        fn1();
        fn2();
        fnX();
    }

function anotherFunctionToWait(){
    //whatever code or functions in here.
}

ありがとうございました。

4

1 に答える 1

0

いいえ。関数は呼び出し元がいつ完了したかを知る方法を提供しないため、関数が完了するのを待つことはできません。何らかの方法で機能を変更する必要があります。

厳密に言えば、モンキーパッチで実現できますが、それは恐ろしい方法です。

于 2013-06-09T23:48:41.460 に答える