JavaScript - 返回承诺和/或呼叫回调?

Ste*_*ast 8 javascript callback promise

我经常在其他人的文档中看到类似的东西:

回调是可选的,如果省略则返回一个promise.

这就是我所拥有的:

export function doSomeAsync(options, callback) {

    const useCallback = (callback && typeof callback == 'function');

    const promise = new Promise((resolve, reject) => {

        // --- do async stuff here ---
        const check = (options.num === 1) ? true : false;
        setTimeout(() => {
            if (check) {
                finish(true, "Number is 1");
            } else {
                finish(false, new Error("Number is not 1"));
            }
        }, 1000);
        // ---------------------------

        function finish(ok, rtn) {
            if (useCallback) {
                if (ok) {
                    callback(null, rtn);
                } else {
                    callback(rtn, null);
                }
            } else {
                if (ok) {
                    resolve(rtn);
                } else {
                    reject(rtn);
                }
            }
        }

    });

    return (useCallback) ? false : promise;
}
Run Code Online (Sandbox Code Playgroud)

finish()函数只是避免if...散布很多语句.

我正在创建一个promise对象,无论我是否使用它.

像这样测试:

doSomeAsync({ num: 1 }).then((result) => {
    console.log('p result', result);
}).catch((err) => {
    console.log('p err', err);
});

doSomeAsync({ num: 1 }, (err, result) => {
    if (err) {
        console.log('cb err', err);
    } else {
        console.log('cb result', result);
    }
});
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我想知道这是否是最好的方式,或者其他人是否有更好,更简洁的实现..?

dec*_*eze 18

如果您只是总是使用承诺,这可以简化,您总是创建它:

export function doSomeAsync(options, callback) {
    const promise = new Promise((resolve, reject) => {
        const check = (options.num === 1) ? true : false;
        setTimeout(() => {
            if (check) {
                resolve("Number is 1");
            } else {
                reject(new Error("Number is not 1"));
            }
        }, 1000);
    });

    if (callback && typeof callback == 'function') {
        promise.then(callback.bind(null, null), callback);
    }

    return promise;
}
Run Code Online (Sandbox Code Playgroud)

你的功能总是以承诺为基础,同时它总是返回一个承诺.调用者可以随意忽略它.回调参数仅仅是一个"遗留回退接口"(或者如果您愿意,可以使用"替代接口")来使用该承诺.

  • 是的,这正是我想的方法.返回`false`似乎有点浪费 - 同样(作为.NET dev和JS)似乎很奇怪从这样的函数返回两种不同的类型. (2认同)