gpt4 book ai didi

javascript - 在javascript中的一系列函数之后返回

转载 作者:行者123 更新时间:2023-11-30 16:42:22 25 4
gpt4 key购买 nike

我已经尝试用 q 做到这一点以及async ,但似乎无法使其发挥作用。在尝试了这些之后,我尝试了自己的方式。我认为这行不通,但我想我会试一试。我很困惑,因为从某种意义上说,回调中有一个回调。这是我想要执行的功能:

var getPrice = function(theData) {
var wep = theData.weapon;
var completed = 0;
for (i = 0; i < theData.skins.length; i++) {
var currSkin = theData.skins[i];
theData.skinData[currSkin] = {};
for (k = 0; k < wears.length; k++) {
csgomarket.getSinglePrice(wep, currSkin, wears[k], false,
function(err, data) {
completed++;
if (!err) {
theData.skinData[data.skin][data.wear] = data;
}
if (completed === theData.skins.length*wears.length) {
return theData;
}
})
}
}
}

我知道这类问题在 javascript 中很常见,因为我以前遇到过它们,但不确定如何解决这个问题。我想用方法返回的所有数据填充我的对象:

csgomarket.getSinglePrice(wep, currSkin, wears[k], false,
function(err, data) { });

由于每次调用 getSinglePrice() 都会发出 GET 请求,因此需要一些时间才能返回响应。任何建议或帮助将不胜感激!

最佳答案

首先 csgomarket.getSinglePrice() 需要被 promise 。这是调用 csgomarket.getSinglePrice() 并返回 Q promise 的适配器函数。

function getSinglePriceAsync(wep, skin, wear, stattrak) {
return Q.Promise(function(resolve, reject) { // may be `Q.promise(...)` (lower case P) depending on Q version.
csgomarket.getSinglePrice(wep, skin, wear, stattrak, function(err, result) {
if(err) {
reject(err);
} else {
resolve(result);
}
});
});
}

现在,您希望 getPrice() 返回一个 promise ,该 promise 在所有单个 getSinglePriceAsync() promise 结算时结算,这是微不足道的:

var getPrice = function(theData) {
var promises = [];//array in which to accumulate promises
theData.skins.forEach(function(s) {
theData.skinData[s] = {};
wears.forEach(function(w) {
promises.push(getSinglePriceAsync(theData.weapon, s, w, false).then(function(data) {
theData.skinData[data.skin][data.wear] = data;
}));
});
});
//return a single promise that will settle when all the individual promises settle.
return Q.allSettled(promises).then(function() {
return theData;
});
}

但是,theData.skinData[data.skin][data.wear] 将稍微简化为 theData.skinData[s][w]:

var getPrice = function(theData) {
var promises = [];//array in which to accumulate promises
theData.skins.forEach(function(s) {
theData.skinData[s] = {}; //
wears.forEach(function(w) {
promises.push(getSinglePriceAsync(theData.weapon, s, w, false).then(function(data) {
theData.skinData[s][w] = data;
}));
});
});
//return a single promise that will settle when all the individual `promises` settle.
return Q.allSettled(promises).then(function() {
return theData;
});
}

这种简化会起作用,因为外部 forEach(function() {...}) 导致 s 陷入闭包中。

由于 getPrice() 现在返回一个 promise ,因此必须按如下方式使用:

getPrice(myData).then(function(data) {
// use `data` here.
}).catch(function(e) {
//something went wrong!
console.log(e);
});

关于javascript - 在javascript中的一系列函数之后返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31760241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com