¿Cómo obtener valores de las promesas?

He estado golpeándome la cabeza contra este problema durante mucho tiempo; demasiado tiempo para lo que es, casi seguro trivial.

Quiero obtener un valor específico, como si fuera devuelto por una función. Se supone que las promesas son marcadores de posición para los valores y onAuthRequired toma una función que devuelveun objeto de respuesta de bloqueo:

{
  authCredentials: {
    username: "..."
    password: "..."
  }
}

Por lo tanto, necesito crear una función que devuelva esa estructura y lo haga de forma asincrónica. Así que puse en elasync palabra clave, lo que significa que puedoawait la resolución de la promesa ... creo. Pero antes de que pueda construir esa estructura, tengo que hacer una operación asincrónica en la API de mensajería nativa ... que no devuelve una promesa ... creo. Así que tengo que envolverlo, de alguna manera, en una promesa ...

Editar: He actualizado el siguiente código para reflejar el estado actual, una amalgama de todas las excelentes respuestas hasta el momento.

async function get_data() {
  return new Promise((resolve, reject) => {
    var data = chrome.runtime.sendNativeMessage('Host', {text:'Ready'},
      function(response) {
        resolve(response);
      }
    };
  })
};

async function get_creds() {
  var data = await get_data();
  if (null != data) {
    creds = JSON.parse(data);
    return {
      authCredentials: {
        username: creds.username,
        password: creds.password
      }
    };
  }
};

chrome.webRequest.onAuthRequired.addListener(
  function(details, get_creds),
  {urls: ["<all_urls>"]},
  ['blocking']
);

Experimenté con el siguiente código:

chrome.webRequest.onAuthRequired.addListener(
  function handler(details){
    var creds = await get_data(); // Uncaught SyntaxError: unexpected identifier
    creds = JSON.parse(creds);
    return {
      authCredentials: {
        username: creds.username,
        password: creds.password
      }
    };
  },
  {urls:["<all_urls>"]},
  ['asyncBlocking']
);

Llamóget_data() directamente pero tuvo un error de identificador inesperado.

Si quitara elawait palabra clave "funcionó" ... es decir, intentó hacer algo en el evento ... pero no devolvió el objeto. Lo que hizo fue configurar un mensaje en la parte inferior izquierda de la pantalla "esperando en la extensión ..." y llamar alget_data() Funcionan aproximadamente 3 veces.

Si cambio['asyncBlocking'] a['blocking'], no puede llamar a get_data () en absoluto.

No tengo idea de lo que está pasando aquí.

Por lo tanto, esto debería pasar el valor devuelto por el host de mensajería nativa a través de estas promesas extrañas y luego conectarse directamente a donde onAuthRequired espera que se devuelva su estructura JSON ...

Editar: espero que el objeto devuelto por get_creds () se pase a onAuthRequired. En este punto actual, hay un token 'token inesperado' enfunction(details, get_creds) ... así que obviamente eso está mal. Sospecho que podría necesitar usar otra promesa enget_creds() que completará elauthCredentials objeto ...

Aparte de todos los identificadores inesperados cuyo origen no puedo entender, tengo la sensación de que estoy haciendo todo esto al revés.

Bienvenido al final de mi ingenio ... y gracias por cualquier luz que puedas arrojar sobre mi ignorancia.

Respuestas a la pregunta(4)

Su respuesta a la pregunta