【问题标题】:Promise then executes even when promise isn't fulfilled [duplicate]即使未履行承诺,承诺也会执行[重复]
【发布时间】: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,因为外部块已经returned undefined; return new Promise 是唯一的方法。
  • 您需要在 displayAdParams 方法中添加异步等待。
  • @HarishSoni 这不会改变任何事情。
  • 就是这样完成的。异步等待将导致 GetTabParamsFrom 存储完全执行,然后它将转到下一个 then
  • @HarishSoni 如果getTabParamsFromStorage 不返回Promise(它目前不在第一个sn-p 中),并且如果它确实返回Promise,则不是.thens 可以正常工作。 async/await 不会解决任何问题

标签: javascript google-chrome-extension promise


【解决方案1】:

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

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

【讨论】:

  • 它不起作用,因为您的括号不匹配。而且他的代码比这些嵌套的承诺链要好。像这样嵌套 Promise 链是你试图避免而不是鼓励的事情。
  • 是的,现在使用 async await 进行了编辑,他可以轻松获取参数
  • 仅供参考,刚刚测试(在您编辑之前)并且也不起作用(即使使用正确的括号)。 getTabParamsFromStorage 仍将返回 undefined。
猜你喜欢
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2016-06-17
  • 2015-11-17
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多