根据我的理解,承诺的方法只有在履行承诺后才会执行。
但是,在下面的displayAdParams中,即使getTabParamsFromStorage未返回承诺/未满足,第二个块也会执行。这导致了#params'在第二个然后阻止未定义。
function displayAdParams() {
getTabId().then(tabId => {
return getTabParamsFromStorage(tabId);
}).then(params => {
console.log('b', params);
updatePopupWithStandardParams(params.shift());
});
}
function getTabId() {
return new Promise((resolve, reject) => {
let queryInfo = {active: true, currentWindow: true};
chrome.tabs.query(queryInfo, tabs => {
resolve(String(tabs[0].id));
});
});
}
此版本的getTabParamsFromStorage不起作用(使用Promise.resolve)
// This doesn't work
function getTabParamsFromStorage(tabId) {
chrome.storage.local.get(tabId, items => {
console.log('a', items[tabId]);
return Promise.resolve(items[tabId]);
});
}
/* output
popup.js:7 b undefined
TypeError: Cannot read property 'shift' of undefined
at getTabId.then.catch.then.params (popup.js:8)
popup.js:47 a Array(7)
*/
这个版本的getTabParamsFromStorage工作正常(使用新的Promise)
// This works
function getTabParamsFromStorage(tabId) {
return new Promise((resolve, reject) => {
chrome.storage.local.get(tabId, items => {
console.log('a', items[tabId]);
resolve(items[tabId]);
});
});
}
为什么会发生这种情况,我该怎么做才能让getTabParamsFromStorage的第一个版本正常工作?
答案 0 :(得分:-1)
您需要像这样执行它才能获得正确的参数。试试这个并让我知道这是否有效
function displayAdParams() {
getTabId().then( async tabId =>
cosnt params = await
getTabParamsFromStorage(tabId);
console.log('b', params);
updatePopupWithStandardParams(params.shift());
});
}