即使承诺没有实现,承诺也会执行

时间:2018-05-15 04:42:15

标签: javascript google-chrome-extension promise

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

但是,在下面的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的第一个版本正常工作?

1 个答案:

答案 0 :(得分:-1)

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

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