node.js中的并行回调Universe?

时间:2015-11-26 19:28:58

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

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

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

1 个答案:

答案 0 :(得分:3)

所有这些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);
    });

  });
}