vedo spesso in altri documenti popoli qualcosa di simile:JavaScript - Restituire la promessa E/O richiamare la chiamata?
callback è facoltativa, se omesso restituisce una promessa.
Questo è quello che ho:
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;
}
La funzione finish()
solo evita un sacco di if...
dichiarazioni sparsi.
Sto creando un oggetto promessa, sia che lo utilizzi o no.
test come questo:
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);
}
});
Questo funziona, ma mi chiedo se questo è il modo migliore, o se altri hanno un'un'attuazione migliore e più succinta ..?
Potrebbe essere più appropriato per http://codereview.stackexchange.com/ – Andy
Quale libreria di promessa stai usando? Bluebird ha anche [una funzione dedicata] (http://bluebirdjs.com/docs/api/ascallback.html) per questo. – Bergi
Sto utilizzando Node v4.2.2, con Babel per ES6 ('babel-preset-es2015 6.6.0'), ma non ho installato lo specifico babel ployfill per le promesse. Quindi il Node nativo promette che credo. –