Разрешение обещания внутри обратного вызова

#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);
 });