繁体   English   中英

等待功能结束(在 async.series 中)无法按预期工作

[英]Wait for function to end (in async.series) doesn't work as expected

我有一个 nodejs 脚本,它使用 API 获取一些包含项目名称和价格的 json 数据,然后检查该项目的价格。 我遇到的问题是检查项目名称的函数在写入价目表的函数结束之前执行。 因此,如果价目表文件不存在,它会为我提供价目表文件“没有这样的文件或目录”。 我在网上搜索了一段时间,我发现了一些关于 async.series 的东西。 我尝试了一些东西,但它似乎不起作用,因为结果是一样的。 如果价目表文件存在,则提示“价格更新成功! Lenght:' 在打印商品价格后出现。

function getPrices() {
    console.log("URL requested: ", API_URL)

    restling.get(API_URL).then(function(result) {
        var JSON_Data = result.data

        if (JSON_Data.status == "success") {
            console.log("Prices updated successfully! Lenght: "+JSON_Data.prices.length)
        } else {
            console.log(JSON_Data)
            console.log("An error ocurred during updating prices!")
            return
        }

        fs.writeFileSync("prices/pricelist.txt", JSON.stringify(JSON_Data.prices))
    })
}

function getItemPrice(item) {
    var file = JSON.parse(fs.readFileSync("prices/pricelist.txt"))

    for (var i = 0; i < file.length; i++) {
        if (file[i].item_name == item) {
            return file[i].price
        }
    }
}

function getItem() {
    var item1 = getItemPrice('Sword');
    console.log(item1);
}

async.series([
    function(callback){ 
        getPrices(); 
        callback();
    },
    function(callback){ 
        getItem();
        callback();
    }
]);

编辑:我尝试过其他方法,但问题仍然存在

async.series([
    function(callback){ 
        getPrices(); 
        callback();
    },
    function(callback){ 
        getItem();
        callback();
    }
], function(error){
    if (error) {
        console.log(error);
    }
});

async.waterfall([
    function(callback){ 
        getPrices(); 
        callback();
    },
    function(arg1, callback){ 
        getItem();
        callback();
    },
], function (error) {
    if (error) {
        console.log(error);
    }
});

嗯,我认为将响应写入文件以供稍后阅读没有太大意义,因为您可以直接使用响应来查找项目,但这应该有效。

function getPrices(callback) {

  restling.get(API_URL).then(function(result) {
    var JSON_Data = result.data

    if (JSON_Data.status == "success") {
      console.log("Prices updated successfully! Lenght: " + JSON_Data.prices.length)
    } else {
      console.log(JSON_Data)
      console.log("An error ocurred during updating prices!")
      return
    }

    fs.writeFileSync("prices/pricelist.txt", JSON.stringify(JSON_Data.prices))
    callback(null, null);
  });
}


function getItemPrice(item) {
  var file = JSON.parse(fs.readFileSync("prices/pricelist.txt"))

  for (var i = 0; i < file.length; i++) {
    if (file[i].item_name == item) {
      return file[i].price
    }
  }
}


function getItem(callback) {
  var item1 = getItemPrice('Sword');
  callback(null, item1);
}


async.series([ 
  getPrices,
  getItem
], 
function(err, result) {
  if (err) {
    console.log(err);
    return;
  }
  console.log("result", result);
});

我认为基于承诺的方法和直接操作响应而不是写入/读取文件,会更容易理解。

function getPrices(url) {
  return new Promise( function(resolve) {
    reslint.get(url).then( function(result) {
        var data = result.data;
        if(data.status === "success") {
          console.log(
            "Prices updated successfully! Lenght: ", 
            data.prices.length
          );
          return resolve(data.prices);
        }
        else {
          throw new Error("An error ocurred during updating prices!");
        }
      })
      .catch(function(ex) {
        throw ex;
      });
  }); 
}


function getItemPrice(item, items) {
  for (var i = 0; i < items.length; i++) {
    if (items[i].item_name == item) {
      return items[i].price
    }
  }
}


getPrices("some/url/which/return/prices")
  .then(function(prices) {
    console.log(getItemPrice("Sword", prices));
  })
  .catch(function(err) {
    console.log("some error -->", err);
  });

如果我没记错的话,系列不会期待最后的回调。

async.series([
    function(callback){ 
        getPrices(); 
        callback();
    },
    function(callback){ 
        getItem();
        callback();
    }
],
function(error, [callback array]){
});

回调数组将包含从函数数组返回的结果。 也许尝试 async.waterfall?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM