![](/img/trans.png)
[英]Async function doesn't return, despite promise resolve() being called
[英]Resolve promise return by Async function
我已经读过 Async 函数隐式返回一个由返回解析的承诺。 有没有办法让 Async 函数返回该承诺,以便我们自己解决?
我有一个用例,我调用一个 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 变量
要获得类似于您想要的东西(即导出解析和拒绝回调),您需要执行以下操作:
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
关键字不能做你想做的事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.