Использование обещаний с системой обмена сообщениями chrome.runtime

В моем проекте расширения Chrome я использую обещания ES6, чтобы получить результат XHR с фоновой страницы и отправить его в контент, но я получаю undefined как значение response в контенте. XHR работает нормально, возвращает значение.

Кстати, queue.js — это просто мой маленький сахар для промисов ES6.

очередь.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
        });
    });
});

comment
Примечание. Я закрыл это как дубликат, так как есть канонический вопрос по теме return true;, но я также проголосовал за оба, так как это чистый вопрос и хороший ответ. Его стоит сохранить, даже если указать на канонический Q.   -  person Xan    schedule 10.05.2016


Ответы (1)


Я нашел ответ, в developer.chrome.com, return true; нужно в onMessage, чтобы хром распознал его как асинхронный. Я не знаю, почему это так, поскольку я позвонил sendResponse внутри then из $.ajax.

person CRIS    schedule 10.05.2016