通过异步函数解决承诺返回

时间:2020-01-31 06:59:24

标签: javascript

我已经阅读到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变量。

1 个答案:

答案 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关键字做您想做的事情。