繁体   English   中英

通过异步函数解决promise返回

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM