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)
当抛出异常时,后续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)