【发布时间】:2018-05-15 13:04:23
【问题描述】:
据我了解,promise 的 then 方法只会在 promise 完成后执行。
但是,在下面的 displayAdParams 中,即使 getTabParamsFromStorage 未返回承诺/未履行,第二个 then 块仍在执行。这会导致第二个 then 块中的“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 正常工作?
【问题讨论】:
-
你不能像那样异步使用
return Promise.resolve,因为外部块已经returnedundefined;return new Promise是唯一的方法。 -
您需要在 displayAdParams 方法中添加异步等待。
-
@HarishSoni 这不会改变任何事情。
-
就是这样完成的。异步等待将导致 GetTabParamsFrom 存储完全执行,然后它将转到下一个 then
-
@HarishSoni 如果
getTabParamsFromStorage不返回Promise(它目前不在第一个sn-p 中),并且如果它确实返回Promise,则不是.thens 可以正常工作。async/await不会解决任何问题
标签: javascript google-chrome-extension promise