Javascript 正在等待父函数解析承诺

Javascript 正在等待父函数解析承诺,javascript,node.js,asynchronous,redis,Javascript,Node.js,Asynchronous,Redis,我的节点应用程序中有一个主线程,如下所示: function main_thread() { console.log("Starting"); values = get_values(1); console.log(values); console.log("I expect to be after the values"); } get_values函数使用包调用hgetall函数。此函数提供回调,但可以通过以下方式实现: function get_values(custom

我的节点应用程序中有一个主线程,如下所示:

function main_thread() {
  console.log("Starting");
  values = get_values(1);
  console.log(values);
  console.log("I expect to be after the values");
}
get_values函数使用包调用hgetall函数。此函数提供回调,但可以通过以下方式实现:

function get_values(customer_id) {
  // Uses a callback for result
  new Promise(function(resolve, reject) {
    redis_client.hgetall(customer_id, function (err, result) {
    if (err) console.log(err)
      console.log("About to resolve");
      resolve(result);
    });
  })
  .then(({result}) => {
    console.log(result);
  });
}
这对于函数中的承诺链接非常有效,但是在我的主线程中效果不太好,因为我不能等待并返回值

下面是我在ruby(我使用的主要语言)中的做法:

def get_values(customer_id)
  return @redis_client.hgetall(customer_id)
end
如何在可重用函数中创建承诺,并使主线程等待函数返回承诺的响应

编辑:

有人建议,可以使用一个链接返回承诺,然后将其链接到主线程中。然而,这仍然意味着在then块之前执行函数调用之后主线程中的任何代码

编辑2:


在与一些IRLJS开发人员朋友进行了长时间的讨论之后,尝试创建同步脚本似乎违背了现代JS的精神。我将回到我的应用程序设计,并致力于使其异步。

就像从函数返回承诺链一样简单

function get_values(customer_id) {
  // Uses a callback for result
  return new Promise(function(resolve, reject) {
    redis_client.hgetall(customer_id, function (err, result) {
    if (err) console.log(err)
      console.log("About to resolve");
      resolve(result);
    });
  })
  .then(({result}) => {
    console.log(result);
  });
}
然后在主异步函数或

让结果=等待获取值;或者获取_值。然后函数结果{}


简单到从函数返回承诺链

function get_values(customer_id) {
  // Uses a callback for result
  return new Promise(function(resolve, reject) {
    redis_client.hgetall(customer_id, function (err, result) {
    if (err) console.log(err)
      console.log("About to resolve");
      resolve(result);
    });
  })
  .then(({result}) => {
    console.log(result);
  });
}
然后在主异步函数或

让结果=等待获取值;或者获取_值。然后函数结果{}

返回get_值中的承诺

现在,在主线程中,您可以像这样等待它:

function main_thread() {
  console.log("Starting");
  get_values(1).then(function(values) {
    console.log(values);
  }).catch(function(error) {
    console.error(error);
  });
}
返回get_值中的承诺

现在,在主线程中,您可以像这样等待它:

function main_thread() {
  console.log("Starting");
  get_values(1).then(function(values) {
    console.log(values);
  }).catch(function(error) {
    console.error(error);
  });
}

下面是一个使用async/await的工作示例。我用超时和数据数组替换了redis

异步函数主线程{ 控制台。日志启动; 值=等待获取值1; log`After await:${values}`; console.logI应位于值之后; } 异步函数get\u valuescustomer\u id{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 常量结果=[1,2,3]; log`Resolving:${result}`; 解决结果; }, 300; }; }
主螺纹 下面是一个使用async/await的工作示例。我用超时和数据数组替换了redis

异步函数主线程{ 控制台。日志启动; 值=等待获取值1; log`After await:${values}`; console.logI应位于值之后; } 异步函数get\u valuescustomer\u id{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 常量结果=[1,2,3]; log`Resolving:${result}`; 解决结果; }, 300; }; }
主螺纹;同样的问题再次出现在不兑现承诺上。主线程永远不会等待异步操作完成。单个函数可以使用wait等待,但该函数仍然会立即返回一个承诺,并且主线程将继续。Javascript的主线程从不等待异步操作。关于如何正确使用承诺,请参阅其他答案,但不要认为这些都会使整个主线停顿。不会。不能让主线程等待。您需要从get_值返回一个承诺,然后在主线程函数中使用承诺链接或等待。不返回承诺也有同样的问题。主线程永远不会等待异步操作完成。单个函数可以使用wait等待,但该函数仍然会立即返回一个承诺,并且主线程将继续。Javascript的主线程从不等待异步操作。关于如何正确使用承诺,请参阅其他答案,但不要认为这些都会使整个主线停顿。不会。不能让主线程等待。您需要从get_值返回承诺,然后在主_线程函数中使用承诺链接或等待。注意:线程在这里可能是一个误称,除非该线程是从web工作线程调用的,或者出于某种原因在单独的节点进程上调用的。感谢Cody的快速响应!但这似乎并没有将数据返回到主线程中?然后它被封装在then函数中,并且在主线程继续运行后数据仍然被使用,对吗?这是最后的一种psuedo代码,我已经对它进行了更新以使其更清晰。您必须将其余代码放在get_值中。然后-是的,这会很快变得丑陋和嵌套,所以使用异步函数main_thread{}并使用wait-foo来避免这种嵌套。注意:线程在这里可能是一个误称,除非该线程是从web worker调用的,或者出于某种原因在单独的节点进程上调用的。感谢Cody的快速响应!但这似乎并没有将数据返回到主线程中?然后它被封装在then函数中,在主线程继续运行之后,数据仍然被使用,对吗?这是一种psuedo代码
最后,我对其进行了更新,使其更加清晰。您必须将其余代码放在get_值中。然后-是的,这会很快变得丑陋和嵌套,因此请使用异步函数main_thread{}和使用Wait foo来避免这种嵌套。谢谢Prerak。除非在get_values函数之后有代码,否则该代码将在之前运行,对吗?我希望暂停此主线程来完成此操作。在这种情况下,您可以将该代码添加到then块中。谢谢Prerak。除非在get_values函数之后有代码,否则该代码将在之前运行,对吗?我希望暂停此主线程以执行此操作。在这种情况下,您可以将该代码添加到then块中。谢谢@crashmstr。这绝对是做我想做的事情的方式!然而,在与我认识的一些JS开发人员讨论了IRL之后,这种行为似乎与现代JS编程背道而驰。我想我将在我的应用程序中进行一些设计更改,并将其构建为更异步的。这绝对是对所问问题的答案!谢谢@crashmstr。这绝对是做我想做的事情的方式!然而,在与我认识的一些JS开发人员讨论了IRL之后,这种行为似乎与现代JS编程背道而驰。我想我将在我的应用程序中进行一些设计更改,并将其构建为更异步的。这绝对是对所问问题的答案!