2017-01-23 19 views
0

Background.js約束の値を返すために:Chromeの拡張機能 - どのようにコールバックで実行されるスクリプトから

chrome.tabs.executeScript(tab.id, 
{ 
    file: "exec_script.js" 
}, function(res) { 
    console.log(res); 
}); 

exec_script.js:

var test = html2canvas(document.body, { 
    allowTaint: false, 
    letterRendering: true, 
    logging: true 
}).then(function (canvas) { 
    var dataUrl = canvas.toDataURL(); 
    var bImage = dataUrl.replace('data:image/png;base64,', ''); 
}); 
test 

私の知る限りの、 exec_script.jsの最後のステートメントを結果パラメータとしてコールバックに渡す必要があります。しかし空のオブジェクトを返します。

しかし、私はexec_script.jsに、次のようにする場合:

var test = "good"; 
test 

これは、コールバックに変数の値を返します。

また、タブはフォーカスされていません。

+0

_ "それは空のオブジェクトを返します" _本当に 'res'は普通のオブジェクトですか?コールバックにどのような価値を渡すことを期待していますか? – guest271314

+0

私はコールバックの "bImage"値を見たいと思います。 –

+0

コールバック時に '.then()'を 'res'にチェーンして、' .then() 'から' html2canvas'コールに 'bImage'を返そうとしましたか? – guest271314

答えて

0

chrome.tabs.executeScriptによって返される結果は、実行されるスクリプト本体によって生成されます。つまり、同期JavaScriptの標準的な動作です。それはexecuteScriptによってピックアップされますように

あなたのケースでは、同期部分はtestオブジェクト、スケジュールの約束を作成しますが、まだ(a task/microtask is queuedを)それを実行しない、最後のステートメントとしてだけで初期化さtestオブジェクトを置きます。さらに、executeScriptはオブジェクトのJSON可能な部分だけを転送し、testは複合クラスオブジェクトであるため、空のオブジェクトが転送されます。コンソールでconsole.log(JSON.stringify(test))を調べることで、手動で確認できます。

  • background.js

    chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 
        console.log(sender.tab, msg); 
        // do something 
    }); 
    chrome.tabs.executeScript(tab.id, {file: "exec_script.js"}); 
    
  • exec_script.js

    var test = html2canvas(document.body, { 
        allowTaint: false, 
        letterRendering: true, 
        logging: true 
    }).then(function(canvas) { 
        var dataUrl = canvas.toDataURL(); 
        var bImage = dataUrl.replace('data:image/png;base64,', ''); 
        chrome.runtime.sendMessage({dataUrl: dataUrl}); 
    }); 
    

N.B.:非同期コード使用messagingの結果を転送する

JSONで可能なオブジェクトの一部のみがメッセージング経由で転送されます。

関連する問題