我已经阅读到Async函数隐式返回一个promise,该诺言将由返回来解决。 有没有办法让Async函数返回那个承诺,以便我们自己解决呢?
我有一个用例,其中我调用一个api,该API接受将被异步调用的函数。
/**
*
* @param {Array} keys - list of keys to get values
*/
let getStorageValues = async (keys) => {
// chrome.storage.sync.get accepts second argument which is called asynchronously.
chrome.storage.sync.get(keys, (values) => {
if (values) {
return values;
} else {
return new Error('throw')
}
})
}
相反,我想要类似
let getStorageValues = async (keys) => {
let AsyncPromise = Async Function Promise.
chrome.storage.sync.get(keys, (values) => {
if (values) {
AsyncPromise.resolve(values);
} else {
AsyncPromise.reject(new Error('throw'))
}
})
}
如果我可以访问Async函数返回的Promise,则可以使用它来解析chrome.storage.sync.get
中使用的values变量。答案 0 :(得分:1)
要获得与您想要的内容相似的内容(即,导出解析并拒绝回调),您将需要执行以下操作:
let getStorageValues = (keys) => { // Note: no async keyword because it is useless
let resolve;
let reject;
let AsyncPromise = new Promise((a,b) => {
resolve = a;
reject = b;
});
chrome.storage.sync.get(keys, (values) => {
if (values) {
resolve(values);
} else {
reject(new Error('throw'))
}
})
return AsyncPromise;
}
但这显然比通常的更为冗长:
let getStorageValues = (keys) => { // Note: no async keyword because it is useless
return new Promise((resolve,reject) => {
chrome.storage.sync.get(keys, (values) => {
if (values) {
resolve(values);
} else {
reject(new Error('throw'));
}
});
}
}
在node.js上,您还可以整理代码以利用util.promisify
:
const util = require('util');
let getStorageValues = util.promisify((keys,errorFirstCallback) => {
chrome.storage.sync.get(keys, (values) => {
if (values) {
errorFirstCallback(null,values);
} else {
errorFirstCallback(new Error('throw'));
}
});
});
不幸的是,无法使async
关键字做您想做的事情。