7

ajax 呼び出しを含む関数があります。

function example(param, callback) {
    $.ajax({
        type: "GET",
        url: param,
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(data) {
            // do something with data
            callback(data);
        }
    });
}

私はそれを次のように呼びます:

example("http://www.example.com", function(result) {
    // do something with result
})

しかしexample()、私はこのコンテキストで使用したいと思います:

text.replace(/[regex not shown]/g, function(){
    return RegExp.$1 + example(RegExp.$2); // does not work
});

つまり、正規表現は複数の一致を検出し、それに を追加しexample([whatever it matched])ます。統合する方法はありますか

example("http://www.example.com", function(result) {
    // do something with result
})

text.replace()

前もって感謝します!

4

4 に答える 4

1

できません。これは、.replace() メソッドに関数リテラルを渡しているためです。そのため、replace メソッドは、その関数 .toString() が返す文字列 (そのソース コード) を引数として受け取ります。

これは、.replace() メソッドが同期的であり、コールバックを 2 番目の引数として期待せず、文字列であるためです。そうでない場合は、2 番目の引数を文字列に変換します。

パラメータで実際に関数を呼び出すと、関数に戻り値が定義されていないため、「未定義」が2番目の値として解析されます。

ただし、独自の非同期置換メソッドを記述して、それを String プロトタイプに追加することはできます。私は自分の携帯電話でコードを編集できないので、コンピューターに戻ったときにコードを書きます。

編集:

実際、私は間違っていました。replace メソッドでコールバックを使用できます。問題は、そこで非同期呼び出しを使用している方法です。あなたが何をしようとしているのかわからないので、これがあなたの助けになることを願っています。

String.prototype.myReplace=function(re, o, p){
    var v=[];
    var t=this;
    t.toString().replace(re, function(m){
        if(m==RegExp.$1){v[1]=m;};
        if(m==RegExp.$2){v[2]=m;};
    });
    $.ajax({
        type: "GET",
        url: v[2],
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(data) {
            // do something with data

            o[p]=t.toString().replace(re, function(m){
                if(m==RegExp.$1){return v[1];};
                if(m==RegExp.$2){return data.toString();};
            });
        }
    });
};

そして、次のように呼び出します。

text.myReplace(/[regex not shown]/g, this/* or whatever object is */, 'text'});
于 2012-12-09T18:59:50.283 に答える
0

ConversationJSを試してください:

https://github.com/rhyneandrew/Conversation.JS

これにより、明示的な呼び出しを行うのではなく、本質的にイベントへの呼び出しをバインドする、まったく新しい方法で関数呼び出しを行うことができます。それはあなたがあなたがやろうとしていることをはるかに「切り離された」方法で正確に行うことを可能にするでしょう、それはそれが将来変更されそして維持されることも簡単であることを意味します!ネストされた依存関係は決して良いものではないことを忘れないでください!

于 2012-12-09T23:09:31.507 に答える
0

友人、私はあなたの質問を明確に理解していません...以下のコードを試すことができます...うまくいくかどうかわかりません...

function example(param, callback) {
    $.ajax({
        type: "GET",
        url: param,
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(data) {
            // do something with data
            if(typeof callback!='undefined'){callback(data)}else{return data};
        }
    });
}
于 2012-11-13T12:13:48.047 に答える
0

ajax 呼び出しを行い、正規表現での一致の置換を処理する関数を作成します。上記の内容に基づいて、これらのタイプの置換を複数回実行する場合、これが最もモジュール化されたアプローチです。

function replaceTextAfterAjax(str, regex, matchSendToServer, fn) {
    var matches = regex.exec(str);
    var externUrl = matches[matchSendToServer];
    $.ajax({
        type: "GET",
        url: externUrl,
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(json) {
            fn(json.serverSideReplaceText, matches);
        },
    })
}

var text = "go to http://www.example.com";
replaceTextAfterAjax(text, /(go to) (.*)$/, 2, function(response, matches) {
    text = matches[1] + ' ' + response;
    // continue to use `text`
});

exec正規表現インスタンスを呼び出して、RegExp の使用をローカルに保つ必要があることに注意してください。これにより、コードがスレッド セーフに保たれ、他のメソッドが別の呼び出しの RegExp.$N 値を取得できなくなります。

于 2012-09-03T18:42:35.320 に答える