使用带有chrome.runtime消息传递系统的promises

CRI*_*RIS 4 javascript asynchronous xmlhttprequest google-chrome-extension es6-promise

在我的chrome扩展项目中,我使用ES6承诺从后台页面获取XHR的结果并将其发送到内容,但我得到的内容undefinedresponse.XHR工作正常,它返回一个值.

BTW,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;
Run Code Online (Sandbox Code Playgroud)

内容:

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;
Run Code Online (Sandbox Code Playgroud)

背景:

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
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

CRI*_*RIS 8

我已经找到了答案,在developer.chrome.com,return true;需要在onMessage使铬会将其识别为异步的.我不知道这是为什么,因为我打电话的情况下sendResponse内部then$.ajax