1

いくつかのコードを設定しました。ajaxリクエスト用の非常にシンプルなAPIを取得したいと思います。

ですから、私がやりたいのは、成功を返すためになんとかして延期されたものを使用することです。

var factory = function(dataParams) {
    return $.ajax({
        type       : "POST",
        dataType   : "json",
        url        : "http://example.com/whatever",
        data       : dataParams,
        beforeSend : function(jqXHR, settings){/*... something here ...*/},
        error      : function(jqXHR, textStatus, errorThrown){/*... something here ...*/},
        complete   : function(jqXHR, textStatus) {/*... something here ...*/}
});

これは、次のようなものによって呼び出されます

var dataTools = {
    "foo" : function(){
        factory({"One": 1}).success(function(jqXHR){
            //Do something to jqXHR
            //Return something to the "upper most" calling... how?
        })
    }
    "bar" : function(){
        factory({"Two": 2}).success(function(jqXHR){
            //Return jqXHR to the "upper most" calling... how?
        })
    }
};

私がこのようにそれを使うことができるように:

$.each(dataTools.foo(), function(k,v){
    console.log(v);
});

基本的に、オブジェクトdataTools.fooは成功から値を返すか、失敗のベントで空のセットを返すか、そのコード分岐をスキップするものを返す必要があります。

を使用して$.when().then()みましたが、ここで説明したようなものにどのように適合させるかがわかりません。

4

1 に答える 1

1

Ajaxは非同期です。

$.each非同期関数では使用できません。

$.whenajaxを呼び出す関数を呼び出す関数を使用して、関連する関数を使用することはできません。

あなたはドキュメントで言われているようなことをする必要があります


次のようなものを試してください。

var dataTools = {
    "foo" : function(){
        $.when(factory({"One": 1})).done(function(a1, a2){
            var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
        });
    }
    "bar" : function(){
        $.when(factory({"Two": 2})).done(function(a1, a2){
            var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
        });
    }
};
于 2011-07-13T14:22:45.263 に答える