[英]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.