Javascript,来自嵌套承诺的全局变量赋值

Javascript,来自嵌套承诺的全局变量赋值,javascript,scope,promise,Javascript,Scope,Promise,我有一个方法来解析检索某些产品的承诺 global.getProducts().then(function (prodPromised) { 对于每个产品,我都有一个类别ID,但我还需要类别名称。 因此,我创建了一个承诺数组,其中我将类别名称分配给每个产品 var products = []; for (var i = 0; i < prodPromised.length; i++) { promises.push(self.createCatName(prodPromised

我有一个方法来解析检索某些产品的承诺

global.getProducts().then(function (prodPromised) {
对于每个产品,我都有一个类别ID,但我还需要类别名称。 因此,我创建了一个承诺数组,其中我将类别名称分配给每个产品

var products = [];

for (var i = 0; i < prodPromised.length; i++) {
    promises.push(self.createCatName(prodPromised[i]));
}
。。。我为一些操作循环它们

for (var i = 0; i < products.length; i++) {
for(var i=0;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
        } );
    });
或者,这是我自己的首选解决方案,因为您不必在作用域之外为其创建变量。您从
回调返回的任何内容都将在下一步中可用:

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 Wait语法,但如果您不知道承诺是什么,请先了解它

异步函数具有wait,但实际上会立即返回一个承诺,因此异步函数之外的任何内容都会立即得到一个承诺,而不会得到等待的结果


有关承诺的原因和方式的详细信息,请参见。

您好,感谢您的帮助,我也曾想过按照您的建议解决此问题,但第一个示例中的“产品”已初始化,第二个示例中的“prodPromised”未定义。更新第二个示例中,我忘记了返回。无论如何,全局属性仍保持为已初始化:-(那么您必须显示其余的代码。在第一个示例中,
products
保持
null
的唯一方法是,
getProducts()
不返回任何内容。或者如果您尝试在之后继续同步代码。我已更新了第一个示例。我认为有一个“定时问题”问题。我的意思是,当我从第二个方法调用全局属性时,数据还没有设置!所以我使用了一个jquery$延迟调用。当:-)是的,你可能尝试在
之外使用产品。然后()
功能正确吗?您好,HMR,我不知道为什么,但我还没有找到您的答案!是的,您的解决方案很棒,我还没有考虑“.map”…谢谢:-)
products.then(
  products=>{
    //use products here
  }
).catch(
  err=>console.warn("Something went wrong getting products:",err)
);