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

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

本文关键字:工作 结束 函数 series async 等待      更新时间:2023-09-26

我有一个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?