【问题标题】:Parallel callback universe in node.js?node.js 中的并行回调宇宙?
【发布时间】:2016-02-29 23:21:30
【问题描述】:

我正在尝试在节点中实现 shopify api,并希望同步调用发布请求,因为我想在发布后检索产品 ID 并将其存储在数组中。我正在使用一个名为deasync 的库作为同步等待循环。该脚本以前可以工作,但突然停止工作。 当我在没有 deasync 循环的情况下记录我的调用时,我看到 shopify 返回了响应,但是,当我使用 deasync 循环运行我的脚本时,我的标识符保持为空,并且 deasync 循环不断迭代。我对 node.js 中的异步请求比较陌生。我的标识符变量的范围似乎是正确的。我现在唯一能想象的是回调发生在与我的 while 循环分开的并行 node.js 宇宙中。任何帮助将不胜感激,谢谢!

function postProduct(Store, product, variants) {

  var identifier = null;

  var post_data = {
    "product": product
  };


  Shopify.post('/admin/products.json', post_data, function(err, data, headers) {

    identifier = {
      id: data.product.id,
      price: data.product.price,
      variants: variants
    };

  });

  while(identifier === null) {
    require('deasync').runLoopOnce();
  }

  return identifier;
}

【问题讨论】:

  • 在第一次滴答之后你不应该有任何类型的同步 I/O。
  • 是的,这真的不是一个好主意。
  • @jov:嗯,就是这样。一个主意。带有概念证明。除非您确切知道自己在做什么,否则不应该真正使用它。
  • 好的,感谢您指出这一点,但在这种情况下,您知道为什么回调似乎永远不会发生吗?

标签: javascript node.js asynchronous synchronous node-async


【解决方案1】:

所有这些deasync 解决方案都不能稳定,因为它们依赖于内部引擎实现。

尝试学习异步方式。这真的很简单。

原生Promise的简化示例:

var products = [
  {Store: {}, product: {}, variant: {}},
  {Store: {}, product: {}, variant: {}},
];

Promise.all(products.map(postProduct)).then(function(identifiers){
  // use identifiers
});

function postProduct(data) {
  return new Promise(function(ok, fail){
    Shopify.post(...., function(){
       //...
       ok(identifier);
    });

  });
}

【讨论】:

  • 它并不是真正的“解决方法”...只是一种更好的方法
  • 很有趣,将尝试使用它。之前在看 Async(github.com/caolan/async) 库,看起来很像
  • Promisenode v0.12 的原生,async 是在 Promise 成为标准事物之前创建的。我自己的方式是async -> Q promises -> es6 Promise
  • 我认为 async.js 是一个更高级别的实用工具带 - 它提供的功能比你通过 Promise 得到的要多得多
  • @Robbie,在大多数情况下,您不需要这些waterfallscargos。但可以肯定的是,这是一个很棒的图书馆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
相关资源
最近更新 更多