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

我有一个nodejs脚本,它使用API​​获取包含项目名称和价格的一些json数据,然后检查该项目的价格。 我所遇到的问题是,在写入价格表的函数结束之前,检查项目名称的函数被执行。 所以如果价目表文件不存在,价目表文件就不会给我这样的文件或目录。 我在网上search了一段时间,发现了一些关于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); } }); 

嗯,我觉得没有太大的意义,把答案写在一个文件中供以后阅读,因为你可以直接使用响应来查找项目,但是这应该起作用。

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

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

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

如果我没有弄错,不会期望最后的callback。

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

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