#javascript #node.js
#javascript #node.js
Вопрос:
Я использую определенный node.js библиотека, в которой вы определяете функцию обратного вызова, которая должна возвращать значение.
Внутри этого обратного вызова я хочу использовать функцию из другой библиотеки, которая возвращает обещание с этим значением.
Как я могу определить функцию обратного вызова, чтобы возвращать значение из разрешенного обещания?
Как мне отредактировать следующий фрагмент, чтобы возвращать значение обратному вызову только тогда, когда обещание было разрешено?
Util_A.someFunction( (a)=>{
Util_B.somePromise(a)
.then((result)=>{
// This is the value that I want to return to
// the original function 'someFunction'
return resu<
});
}),
Комментарии:
1. Привет, попробуйте вернуть Util_B.sommePropose(a) ….материал
2. верните значение обратному вызову — это предложение не имеет смысла. Это не то, как работают обещания и обратные вызовы. Пожалуйста, приведите более значимый пример, который показывает, в чем заключается ваш случай.
3. Что вы подразумеваете под » определением функции обратного вызова для возврата значения «? Вы хотите вернуть его из обратного вызова в
Util_A
? Что именно это такоеUtil_A.somecallback
? Более конкретный пример значительно упростил бы понимание вашего вопроса.4. Я думаю, он хочет дождаться результата обещания, получить значение и вернуть его как возвращаемое значение функции обратного вызова, переданное
Util_A.somecallback
, но предполагается, что это работает не так…5. Вы не можете сделать ни того, ни другого. Вы не можете вернуть значение из результата обещания обратному вызову, и вы не можете передать значение из обратного вызова во внешнюю область.
Ответ №1:
Итак, если я правильно понимаю, somecallback
сделал бы что-нибудь с возвращаемым значением из обратного вызова, который он вызывает.
Если somecallback
не поддерживает обещания или другую асинхронность из retval, это невозможно сделать.
Комментарии:
1. Не уверен, почему это было отклонено, это правильный ответ, если @AKX правильно понял вопрос (что, по общему признанию, неясно)
Ответ №2:
Может быть, что-то вроде этого:?
new Promise(resolve => Util_A.somecallback(resolve))
.then(a => Util_B.somePromise(a))
.then(result => console.log(result))
.catch (err => console.error(err.message));
РЕДАКТИРОВАТЬ: Улучшенная цепочка обещаний.
Комментарии:
1. Вместо
Util_B.somePromise(data).then((result)=>{ resolve(result); }).catch(e => reject(e));
вы можете просто использоватьresolve(Util_B.somePromise(data))
2. вы используете
await
для хранения кода во время выполнения обещаний.3. Если это делает то, что хочет OP, лучше написать
new Promise(resolve => Util_A.somecallback(resolve)).then(a => Util_B.somePromise(a))
4. @Bergi Это еще элегантнее! Спасибо за совет
Ответ №3:
Вы должны преобразовать Util_A
функцию в Promise
функцию на основе. Как? Используя собственный метод Util.promisify() node.js (Я создал пользовательскую реализацию для фрагмента).
Никогда не путайте обратный вызов / обещание.
const Util_A = {
somecallback: callback => callback(false, 'callback return'),
};
const Util_B = {
somepromise: () => new Promise((resolve) => resolve('promise return')),
};
function promisify(func) {
return () => new Promise((resolve, reject) => {
func((err, val) => {
if (err) return reject(err);
return resolve(val);
});
});
}
// Native Util.promisify() in node.js
promisify(Util_A.somecallback)()
.then((ret) => {
console.log(ret);
return Util_B.somepromise();
})
.then((ret) => {
console.log(ret);
});