等待函数结束(在async.series中)没有按预期工作

时间:2016-03-10 20:52:10

标签: javascript node.js asynchronous

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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