等待函数结束(在 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?
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- Javascript”;结束”;函数工作不稳定
- 主页键和结束键don'在页面上创建弹出窗口时无法工作
- 上的jQuery.on('已结束')无法在移动设备上工作
- 动画结束侦听器无法正常工作
- 等待函数结束(在 async.series 中)无法按预期工作
- 代码镜像 - 覆盖主页/结束按钮以正常工作
- 通过 JavaScript 结束 nintex 工作流
- 检测youtube视频何时结束-不工作
- heroku上的后台工作网络是如何知道的's结束了
- HTML5循环4视频后结束之前的视频在phoneGap android应用程序不工作
- 开始在和结束在使用角度火未按预期工作:0.8.0
- 结束事件视频不工作
- 这个for循环是如何工作和结束的
- Firefox在动画结束时从DOM中删除元素时会闪烁,而在Chrome中则可以正常工作
- jquery .html()结束后,绑定就不能工作了
- 触摸结束事件不正常工作在铬
- 在nodejs + express中结束请求后执行工作
- 表单不提交't工作结束时更改输入值