1

私のクロムエクステンションプロジェクトでは、ES6の約束を使ってバックグラウンドページからXHRの結果を得て、それをコンテンツに送信していますが、をresponseコンテンツ内にXHRは正常に動作し、値を返します。chrome.runtimeメッセージシステムで約束を使用する

ところで、queue.jsはES6の約束のための私の小さな砂糖です。

queue.js

function defer() { 
    let resolve = null; 
    let reject = null; 
    let promise = new Promise((_resolve, _reject) => { 
     resolve = _resolve; 
     reject = _reject; 
    }); 

    return { 
     'promise': promise, 
     'resolve': resolve, 
     'reject': reject 
    }; 
} 

module.exports = defer; 

内容:

let Q = require('./queue'); 
let cb = Q(); 

function callback(response) { 
    if (response) { 
     let {result, data} = response; 

     if (result === 'OK') { 
      cb.resolve(data); 

     } else if (result === 'KO') { 
      cb.reject(data); 
     } 
    } 
} 

chrome.runtime.sendMessage({ 
    'event':'some_event', 
    'data': { 
     'user': 'test', 
     'password': '1234' 
    } 
}, callback); 

return cb.promise; 

背景:よう

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 
    $.ajax({ 
     'url': 'I intentionally removed the URL to protect the innocent.', 
     'method': 'POST', 
     'dataType': 'json', 
     'contentType': 'application/json; charset=UTF-8', 
     'data': JSON.stringify({ 
      'username': message.data.user, 
      'password': message.data.password 
     }) 
    }).then((xhr) => { 
     sendResponse({ 
      'result': 'OK', 
      'data': xhr.token 
     }); 
    }).fail((xhr) => { 
     sendResponse({ 
      'result': 'KO', 
      'data': null 
     }); 
    }); 
}); 
+0

注: 'return true;'のトピックに関する正式な質問と同じように、私はこれを二重に閉じたが、私も両方をupvotedそれはきれいな質問であり、良い自己回答です。標準的なQを指していても、それは価値があります。 – Xan

答えて

2

私はdeveloper.chrome.comで、答えを見つけた、return true;onMessageに必要とされていますクロムはそれを非同期として認識します。私はsendResponseの中にsendResponseという名前をつけたので、わからない。$.ajax