使用多个参数将回调转换为promises

时间:2018-03-17 22:18:34

标签: javascript asynchronous callback es6-promise

我已成功将函数“notMyFunction”包装在一个promise中,因此我可以使用“notMyFunction”,就像它是一个promise。像这样:

// I do not have access to "notMyFunction"
function notMyFunction(a, cb) {
    if (a === 'latest') {
        cb('123');
    } else {
        cb('error');
    }
}

// changing callback into a promise
function deploy(someVariable) {
    return new Promise((resolve, reject) => {
        notMyFunction(someVariable, resolve);
    });
}

// using callback as if it were a promise
deploy('latest').then((time) => {
    console.log(time)
}, (err) => {
    console.log(err)
})

我的问题是:当“notMyFunction”实际上将两个参数传递给回调时,我该如何做同样的事情:

function notMyFunction(a, cb) {
    if (a === 'latest') {
        cb(null, '123');
    } else {
        cb('error', null);
    }
}
function deploy(someVariable) {
    return new Promise((resolve, reject) => {
        notMyFunction(someVariable, resolve);
    });
}
deploy('latest').then((time) => {
    // I need access to 123, not null
    console.log(time)
}, (err) => {
    console.log(err)
})

2 个答案:

答案 0 :(得分:1)

我想你可能想看看" promisification"的概念。

较新版本的Node.js具有可以处理此问题的util.promisify函数。 Axel博士有great write-up on util.promisify

如果您在浏览器中,可能需要考虑引入Promisify polyfill / shim,如es6-promisify

在您的代码库中使用一致的方法来宣传功能将有助于您避免许多潜在的问题。

答案 1 :(得分:0)

你的承诺不能很好地处理错误。永远不会有.catch(),因为您从不致电reject()

如果相信你真正想要的东西是:

function deploy(someVariable) {
    return new Promise((resolve, reject) => {
        notMyFunction(someVariable, (firstArg, ...otherArgs) => {

            // assuming that, on errors, your first argument is 'error'
            if (firstArg === 'error') {                         
                reject([firstArg, ...otherArgs]);
            } else {
                resolve([firstArg, ...otherArgs]);
            }
        });
    });
}