0

質問はばかげているかもしれません。私はクロム API の学習を始めたばかりです。しかし、答えを探すとき、私は本当に疲れ果てました。ここにいます:

この構造を使用している場合、すべてが A-OK です。

chrome.tabs.executeScript(tabID, { file: "jquery.js" }, function() {
    chrome.tabs.executeScript(tabID, { file: "script.js" }, function(res)   { 
        alert(res); // I can use this result inside this block
    });
});

問題は、このコードを次のような関数にカプセル化したいということです:

function aFunction( tabID )
{
    chrome.tabs.executeScript(tabID, { file: "jquery.js" }, function() {
        chrome.tabs.executeScript(tabID, { file: "script.js" }, function(res)   { 
            return res;
        });
    });
}

次に、この関数を次のように使用します。

alert(aFunction(tabID));

このアラート命令によって提供されるメッセージは「未定義」です。関数の書き方はいろいろ試しましたが、常に「undefined」が返ってきます。

私がしたいことを実装する方法があることを願っています。

前もって感謝します。

4

1 に答える 1

1

Chrome 拡張 API は非同期であるため、それらを関数内にラップすると、そのラップ関数は非同期の結果に基づいて値を同期的に返すことができません。ラッピング関数は、Chrome API コールバック関数が開始するに戻り値を宣言する必要があります。

あなたはこれを行うことができます:

function aFunction( tabID, callback )
{
    chrome.tabs.executeScript(tabID, { file: "jquery.js" }, function() {
        chrome.tabs.executeScript(tabID, { file: "script.js" }, function(res)   { 
            callback(res);
        });
    });
}

を返す代わりに、終了時に実行resされるコールバック関数を に渡すことができます。aFunctionexecuteScript

aFunction(1234, function(resultArg) {
    alert("if you're seeing this, the inner executeScript finished");
    alert("it has result" + resultArg);
});

内部は呼び出しをexecuteScript実行し、最初の引数としてwithにcallback(res)渡された関数を呼び出します。aFunctionres

値を必要とするコードresは、コールバック内に配置する必要があることに注意してください。コールバックの外側のコードには、コールexecuteScriptバックがまだ解決されているという保証はありません (実際には負の保証があります)。

于 2013-10-16T13:21:44.150 に答える