即使承诺未兑现,承诺也会执行



根据我的理解,承诺的then方法只有在承诺实现后才会执行。

但是,在下面的displayAdParams中,即使getTabParamsFromStorage没有返回承诺/未实现,第二个然后块仍在执行。这会导致第二个 then 块中的"参数"未定义。

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工作正常(使用新的承诺(

// 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正常工作?

你需要像这样执行它才能获得正确的参数。试试这个,让我知道这是否有效

function displayAdParams() {
getTabId().then( async tabId => 
cosnt params = await  
getTabParamsFromStorage(tabId);
console.log('b', params);
updatePopupWithStandardParams(params.shift());
});
}

最新更新