[英]Javascript, global variable assignment from nested Promises
我有一种方法可以解决可检索某些产品的承诺
global.getProducts().then(function (prodPromised) {
对于每个prodPromised,我都有一个类别ID,但我也想要类别名称。 因此,我创建了一个promise数组,在其中将类别名称分配给每个产品。
var products = [];
for (var i = 0; i < prodPromised.length; i++) {
promises.push(self.createCatName(prodPromised[i]));
}
在那之后,我履行了诺言...
Promise.all(promises).then((products) => {
...我循环执行一些操作
for (var i = 0; i < products.length; i++) {
问题是我想将阵列产品存储在“上部”位置,以便将其用于另一种方法。
我想这与起重有关,但是我不知道该怎么做:-(
谢谢
您可以创建一个变量,将其分配给诺言。 请记住,您必须继续执行异步代码!
let products = null;
global
.getProducts()
.then(function (prodPromised) {
products = prodPromised;
})
这将无法工作:
let products = null;
global
.getProducts()
.then(function (prodPromised) {
products = prodPromised;
});
products.forEach( function( product ) {
// do stuff
} );
但这应该:
let products = null;
global
.getProducts()
.then(function (prodPromised) {
products = prodPromised;
})
.then(function() {
products.forEach( function( product ) {
// do stuff
} );
});
或者,这是我自己的首选解决方案,因为您不必在范围之外为其创建变量。 从.then()
回调返回的所有内容都将在接下来的内容中提供:
global
.getProducts()
.then(function (prodPromised) {
// do first stuff
return prodPromised;
})
.then(function (prodPromised) {
// do second stuff.
});
如果createCatName是同步函数,则可以执行以下操作
const products = global.getProducts().then(
products=>
products.map(self.createCatName)
);
如果createCatName是异步函数,则可以执行此操作
const products = global.getProducts().then(
products=>
Promise.all(
products.map(self.createCatName)
)
);
当您想使用产品时,可以使用产品承诺:
products.then(
products=>{
//use products here
}
).catch(
err=>console.warn("Something went wrong getting products:",err)
);
有价产品不是实际的产品列表,而是将来可能会或可能不会提供的产品列表(如果出现错误,则可能不会)。
因此,如果您要访问产品,则始终必须作为承诺来访问它,可以使用async await语法,但是如果您不知道承诺是什么,请首先学习该内容。
异步函数已经处于等待状态,但是实际上实际上立即返回了一个Promise,因此异步函数之外的任何东西都会立即被传递给Promise,而不会得到等待的结果。
更多关于为什么以及如何实现承诺的信息可以在这里找到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.