【问题标题】:js promise wait until resolved to continue "main"js 承诺等到解决后再继续“main”
【发布时间】:2021-11-23 13:13:48
【问题描述】:

如何强制函数在 JavaScript 中使用它之前解决待处理的 Promise

  generateKey(pass, iter).then(function(result) {
    Pkey = result;
  });

在 Pkey 上方返回 <empty string> 在解析之前我可以编写一个循环来检查非空,但这似乎违反直觉,不是吗?

  Pkey = generateKey(pass, iter);

返回一个最终实现的未决承诺

function generateKey(passwd, iterations) {

  var encoder = new TextEncoder('utf-8');
  var passphraseKey = encoder.encode(passwd);
  var saltBuffer = encoder.encode("carthage");

  return crypto.subtle.importKey(
    'raw',
    passphraseKey,
    {name: 'PBKDF2'},
    false,
    ['deriveBits', 'deriveKey']
  ).then(function(key) {
//    console.log(key);
    return window.crypto.subtle.deriveKey(
    { "name": 'PBKDF2',
      "salt": saltBuffer,
      "iterations": iterations,
      "hash": 'SHA-256'
    },
    key,
    { "name": 'AES-CBC',
      "length": 256
    },
    true,
    [ "encrypt", "decrypt" ]
  )
  }).then(function (webKey) {
//    console.log(webKey);
    return crypto.subtle.exportKey("raw", webKey);
  }).then(function (buffer) {
//    console.log(buffer);
//    console.log(saltBuffer);
//    console.log("Private Key = " + buf2hex(buffer));
//    console.log("Salt = " + bytesToHexString(saltBuffer));
    return buffer;
  });

}



function buf2hex(buffer) { // buffer is an ArrayBuffer
  return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}



function bytesToHexString(byteArray) {
  return Array.prototype.map.call(byteArray, function(byte) {
    return ('0' + (byte & 0xFF).toString(16)).slice(-2);
  }).join('');
}

【问题讨论】:

  • 如何强制函数在 JavaScript 中使用它之前解决待处理的承诺 - 你不需要。 Javascript 不能那样工作。您使用 .then()await 从承诺中获取已解决的值。没有其他选择。你不能让一个函数等待返回,直到一个承诺解决。相反,您返回承诺,然后调用者在该承诺上使用 .then()await 来获取其值。

标签: javascript asynchronous promise


【解决方案1】:

您可以使用async & await 如下

async function generateKey(passwd, iterations) {...}
...
Pkey = await generateKey(pass, iter);

【讨论】:

  • 但是,请记住,这个函数仍然会返回一个 Promise,并且这个函数的调用者仍然必须使用 .then()await 来从这个函数返回的 Promise 中获取解析值.
猜你喜欢
  • 2018-10-02
  • 2021-05-21
  • 2016-03-19
  • 2017-09-19
  • 2017-09-07
  • 2018-12-14
  • 2021-08-11
  • 2016-12-01
相关资源
最近更新 更多