return promise
allow first parameter to be the options-object if no callback has been specified