Слово предостережения (как усвоено из опыта): будьте осторожны при смешивании обещаний и обратных вызовов. Это может сделать вещи позже.
Однако, чтобы получить в точности то, что вы просите, вы можете разрешить асинхронную функцию с массивом, а затем использовать деструктуризацию массива для передачи (иногда называемой "распространением") аргументов в ваш обратный вызов: (Разрушение объекта, как показано в другом ответе, также является разумным вариантом)
function callback(err, results) {
console.log("error: ", err);
console.log("result: ", results);
}
function async() {
return Promise.resolve(["your errors", "your results" ]);
}
async().then(([error, results]) => callback(error, results));
Это делает то, что вы хотите, но важно отметить, какие проблемы могут возникнуть с этим кодом. Функция async()
должна будет «нарушать правила» с цепочкой обещаний, разрешая обещание с ошибкой. (Либо «устранить ошибку» и / или «отклонить хорошие результаты»). Кроме того, порядок этого массива имеет значение. Даже если это объект, простые вещи, такие как правильное написание свойств объекта (т. Е. «Err» prop против «error»), могут вызвать проблемы.
Кроме того, в функции обратного вызова, вероятно, потребуется наличие некоторого условия, которое сначала проверяет ошибку и обрабатывает ее, прежде чем что-либо делать с результатами.
Однако, если используются только обещания , то код можно немного очистить следующим образом:
function async(){
var err = 'sad face'; // Play with these vars to see what happens
var results = 123;
if( err ){
return Promise.reject(err);
} else {
return Promise.resolve(results);
}
}
async()
.then((resp) => { console.log(resp) /* Work with resp, no conditionals needed :) Merrily proceed with your remaining code */ })
.catch((err) => { console.error(err)/* Err occurred, handle it here */ })