Manejo de condiciones previas idiomáticamente con ES6 Promises

Soy nuevo en ES6 Promises y he estado investigando. Tengo un código ejecutándose en NodeJS que hace un trabajo asíncrono, pero tengo algunas condiciones previas que deben verificarse primero. Estoy buscando elmejores prácticas idiomáticas para tratar con esto (si tal cosa existe) junto con algún razonamiento. Espero obtener una comprensión, ya que tengo un código de trabajo.

Considere el siguiente fragmento de ficción:

function doStuff(data, cb) {
     if (!data) {
         return cb(new Error("Don't be an idiot"));
     }

     externalLibrary.doSomethingCallbackAsync(data, cb);
}

Si tradujera esto a la tierra prometida, veo dos opciones.

Opción 1, Puedo incluir la condición previa en la promesa.

function doStuff(data){
    return new Promise((resolve, reject) => {
        if (!data) {
            return reject(new Error("Don't be an idiot"));
        }

        externalLibrary.doSomethingCallbackAsync(data, function(err, newData) {
            if (err) {
                return reject(err);
            }
            return resolve(newData);
        });
    });
}

opcion 2, Puedo ejecutar la condición previa antes de la promesa. No estoy seguro de entender la intención dePromise.reject(), pero parece encajar en el proyecto de ley al permitirme devolver una promesa rechazada de inmediato.

function doStuff(data){
    if (!data) {
        return Promise.reject(new Error("Don't be an idiot"));
    }

    return new Promise((resolve, reject) => {
        externalLibrary.doSomethingCallbackAsync(data, function(err, newData) {
            if (err) {
                return reject(err);
            }
            return resolve(newData);
        });
    });
}

yo prefieroopcion 2 por razones de legibilidad, pero no entiendo completamentePromise.reject() y me preocupa queopcion 2 Lo está mal usando. Solo para reiterar, estoy buscando una solución de mejores prácticas.

Respuestas a la pregunta(1)

Su respuesta a la pregunta