我是否正确地链接了Promises或犯了罪?

Nic*_*oso 6 javascript promise es6-promise

我已经很长时间没有使用Javascript了,所以现在promises对我来说是一个新概念。我有一些操作需要多个异步调用,但是我想将其视为事务,如果之前的步骤失败,则步骤不会执行。目前,我通过嵌套链接诺言,我想将诺言返回给调用者

在阅读了Mozilla的《使用承诺》指南的链接部分之后,我不确定我在做什么是否正确或等同于“厄运的回调金字塔”。

有没有一种更清洁的方法(除了与每个检查员进行链锁外then)?我是否相信在Mozilla的示例中,then即使发生错误,它也会执行每个链接的代码?

myfunction(key) => {
    return new Promise((outerResolve, outerReject) => {
        return new Promise((resolve, reject) => {
            let item = cache.get(key);
            if (item) {
                resolve(item);
            } else {
                //we didnt have the row cached, load it from store   
                chrome.storage.sync.get(key, function (result) {
                    chrome.runtime.lastError
                        ? reject({ error: chrome.runtime.lastError.message })
                        : resolve(result);
                });
            }
        }).then((resolve) => {
            //Now the inner most item is resolved, we are working in the 'outer' shell
            if (resolve.error) {
                outerReject(resolve);
            } else {
                //No error, continue
                new Promise((resolve, reject) => {
                    chrome.storage.sync.get(keyBasedOnPreviousData, function (result) {
                        chrome.runtime.lastError
                            ? reject({ error: chrome.runtime.lastError.message })
                            : resolve(result);
                    });
                }).then((resolve) => {
                    //finally return the result to the caller
                    if (resolve.error) {
                        outerReject(resolve);
                    } else {
                        outerResolve(resolve);
                    }
                });
            }
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

Dam*_*ien 1

当抛出异常时,后续then语句不会被执行(直到 a )。catch此外,.then还会返回一个 Promise,因此您无需创建额外的外部 Promise。

试试这个例子:

var p = new Promise((resolve, reject) => {
    console.log('first promise, resolves');
    resolve();
})
.then(() => {
    throw new Error('Something failed');
})
.then(() => {
    console.log('then after the error');
    return('result');
});

p.then(res => console.log('success: ' + res), err => console.log('error: ' + err));
Run Code Online (Sandbox Code Playgroud)

您不会在控制台中看到“然后在错误之后”,因为这是在引发异常之后发生的。但如果你对throw声明进行评论,你将得到你在 Promise 中期望的结果。

我不确定我完全理解你的例子,但我认为它可以像这样简化:

myfunction(key) => {
    return new Promise((resolve, reject) => {
        let item = cache.get(key);
        if (item) {
            resolve(item);
        } else {
            //we didnt have the row cached, load it from store   
            chrome.storage.sync.get(key, function (result) {
                chrome.runtime.lastError
                    ? throw new Error(chrome.runtime.lastError.message)
                    : resolve(result);
            });
        }
    }).then((previousData) => {
        // keyBasedOnPreviousData is calculated based on previousData
        chrome.storage.sync.get(keyBasedOnPreviousData, function (result) {
            chrome.runtime.lastError
                ? throw new Error(chrome.runtime.lastError.message)
                : return result;
        });
    });
}
Run Code Online (Sandbox Code Playgroud)