Tôi thường thấy trong các tài liệu của người khác như sau:JavaScript - Trả lời lời hứa VÀ/HOẶC gọi lại cuộc gọi?
Gọi lại là tùy chọn, nếu bỏ qua trả về lời hứa.
Đây là những gì tôi có:
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;
}
Chức năng finish()
chỉ tránh được rất nhiều if...
tuyên bố rải rác xung quanh.
Tôi đang tạo đối tượng lời hứa, cho dù tôi có sử dụng hay không.
kiểm tra như thế này:
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);
}
});
này hoạt động, nhưng tôi đang tự hỏi nếu điều này là cách tốt nhất, hoặc nếu người khác có thực hiện tốt hơn và gọn gàng hơn ..?
Có thể phù hợp hơn cho http://codereview.stackexchange.com/ – Andy
Bạn đang sử dụng thư viện lời hứa nào? Bluebird thậm chí có [một chức năng chuyên dụng] (http://bluebirdjs.com/docs/api/ascallback.html) cho việc này. – Bergi
Tôi đang chạy Node v4.2.2, với Babel cho ES6 ('babel-preset-es2015 6.6.0'), nhưng tôi chưa cài đặt ployfill cụ thể cho lời hứa. Vì vậy, bản địa Node hứa hẹn tôi đoán. –