0

次のように設定されたネストされたコールバックがあります。

function submitForm() {
  BuildContent($('#Content').val(), '', true, submitForm)   
  PerformSubmit();
}

function BuildContent(textWithUrl, textSource, isSubmit, callback) {
  console.log("GetWebContent in Progress");
  GetWebContent(sendurls, BuildContent)
  console.log("GetWebContent done");
  callback();
}

function GetWebContent(content, callback) {
  $.ajax({....
    sucess:function(msg) { .....
      callback();
  }

}

予想される結果は、submitForm が呼び出されたときに、GetWebContent を呼び出す Build Conetent を呼び出すことです。o* GetWebContent 内での ajax 呼び出しが成功した後にのみ、PerformSubmit() のみ。実行されます。* 何らかの理由でループし、JS がハングして応答しなくなり、BuildContent コンソール ログがループで印刷され続けます。

4

2 に答える 2

1

console.logのBuildContent直後に呼び出されるコールバックは、submitForm 即座に呼び出す関数であるBuildContentため、無限ループになります。

詳細な分析を行わずにcallback、 の最後にある呼び出しを削除し、BuildContent代わりに への呼び出しの 2 番目のパラメーターとして渡すことをお勧めしますGetWebContent

もう少し考えた後、submitForm送信先のコールバックは にBuildContentなるはずですPerformSubmitbuldContent立っている私の変更。

于 2013-05-18T19:27:37.377 に答える
0

コールバックの仕組みについて誤解しているようです。コールバックが戻ったとき、中断した場所から実行を再開することはありません。コールバックを呼び出す関数はすぐに終了します。

次のようにコードを構成する必要があります。

function submitForm(){
    BuildContent($('#content').val(), '', true, performSubmit);
}

function BuildContent(textWithUrl, textSource, isSubmit, callback){
    console.log("GetWebContent in Progress");
    GetWebContent(sendurls, callback);
}

function GetWebContent(content,callback){
    $.ajax({...
        success:function(msg){ ....
            console.log("GetWebContent done");
            callback(); <-- performSubmit is being called here, 
                        after all of the asynchronous work is done
        }
    });
}

これらの各関数へのコールバックとして performSubmit を渡し、それを success 関数で呼び出していることがわかります。

BuildContent 内の GetWebContent 呼び出しの後はすべてすぐに実行されるため、console.log への 2 回目の呼び出しが ajax 要求の完了後に行われるとは期待できません。

于 2013-05-18T19:34:27.717 に答える