1

現在、javascript ajax-call に名前のない関数があります。

(このコードは必要最小限にカットされているため、いくつかのエラーがある可能性があります)

function call(name){
    var type = services[name].type


    $.oajax({
        success: function(data) {
            fbposts=data.data
                if (type === "grupp"){
                    var postid=fbposts[fbpost].id.split("_");
                    return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
                }
                else if (fbposts[fbpost].actions){
                    return fbposts[fbpost].actions[0].link;
                }
            }
        }       
    })
};

差し入れで使いたい

success: successfunction,

そして、次のような関数を参照します。

function success(data) {
            fbposts=data.data
                if (type === "grupp"){
                    var postid=fbposts[fbpost].id.split("_");
                    return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
                }
                else if (fbposts[fbpost].actions){
                    return fbposts[fbpost].actions[0].link;
                }
            }
        }       
    })

この時点で、type-variable はもはや定義されていません。どうにかしてこれを解決できますか?

4

3 に答える 3

3

うまくいく可能性のあるアプローチの1つは、-のcontextパラメーターを使用すること$.ajaxです。次に例を示します。

function successFunction(data) {
    fbposts=data.data;
    if (type === "grupp"){
        var postid=fbposts[fbpost].id.split("_");
        return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
    }
    else if (fbposts[fbpost].actions){
        return fbposts[fbpost].actions[0].link;
    }
}

function call(name){
    var type = services[name].type;
    $.oajax({
        success: successFunction,
        context: { type: type }
    );
}

関数内でcontext原因を使用して、に渡したものをポイントします。したがって、上記の例では、thissuccesscontextsuccessFunction

if (type ...)

これは、を参照することを意味しtypeます。これは、内から保存したthis.type値と同じです。typecontextcall

于 2012-08-01T10:51:57.923 に答える
1

success()はい、内部を定義することでそれを解決できるcallので、これは同じスコープを持ちます:

function call(name){
    var type = services[name].type;
    function success(data) {
                fbposts=data.data
                    if (type === "grupp"){
                        var postid=fbposts[fbpost].id.split("_");
                        return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
                    }
                    else if (fbposts[fbpost].actions){
                        return fbposts[fbpost].actions[0].link;
                    }
                }
            }       
        })

    $.oajax({
        success: success   
    })
};

別の解決策は、それを屋外に保管することです。いくつかの外部スコープ、いくつかの変数、またはDOM要素の1つにアタッチされています。

ラッパーを使用することもできます。適切なタイプで呼び出されると、次のようなこのタイプを認識している成功関数が返されます。

function make_success(type){
    return function(data){
        // do what you need for success callback
    };
}
var my_success_callback = make_success('some_type');
于 2012-08-01T10:50:39.233 に答える
0

Python デコレーターのように、success 関数から ajax に渡す必要がある関数を返し、型変数を親関数に渡すことができます。次に例を示します。

function call(name){
    var type = services[name].type;

    $.ajax({
        success: success(type)
    })
};

function success(type) {
    return function(data) {
        // We have access to 'type' in here!

        fbposts=data.data;
        if (type === "grupp"){
            var postid=fbposts[fbpost].id.split("_");
            return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
        }
        else if (fbposts[fbpost].actions){
            return fbposts[fbpost].actions[0].link;
        }
    }
}
于 2012-08-01T10:54:13.807 に答える