【发布时间】:2016-08-18 16:33:39
【问题描述】:
我经常在其他人的文档中看到类似的内容:
回调是可选的,如果省略则返回一个承诺。
这就是我所拥有的:
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;
}
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);
}
});
这可行,但我想知道这是否是最好的方法,或者其他人是否有更好、更简洁的实现..?
【问题讨论】:
-
你使用的是什么承诺库? Bluebird 甚至为此提供了 a dedicated function。
-
我正在运行 Node v4.2.2,使用 Babel for ES6 (
babel-preset-es2015 6.6.0),但我还没有为 Promise 安装特定的 babel ployfill。所以我猜是原生 Node 承诺。
标签: javascript callback promise