В моем проекте расширения 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
});
});
});
return true;
, но я также проголосовал за оба, так как это чистый вопрос и хороший ответ. Его стоит сохранить, даже если указать на канонический Q. - person Xan   schedule 10.05.2016