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

时间:2018-02-16 09:25:40

标签: javascript scope promise

我有解决检索某些产品的承诺的方法

global.getProducts().then(function (prodPromised) {

对于每个prodPromised,我有一个类别ID,但我也想要类别名称。 所以,我创建了一个promises数组,我在其中为每个Product指定了Category Name。

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++) {

问题在于我想将数组产品存储在“上”位置,以便将其用于另一种方法。

我想有一些与吊装相关的东西,但我不明白该怎么做: - (

由于

2 个答案:

答案 0 :(得分:0)

您可以创建一个分配承诺的变量。 请记住,您必须继续使用异步代码!

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.
    });

答案 1 :(得分:0)

如果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)
);

价值产品不是实际的产品清单,而是将来可能会或可能不会提供的产品清单(如果出现错误,则可能不会)。

因此,如果您想要访问产品,您始终必须将其作为承诺访问,您可以使用异步等待语法,但如果您不知道承诺是什么,那么请先了解它。

异步函数已经等待,但实际上会立即返回一个promise,因此异步函数之外的任何内容都会立即传递一个promise并且不会得到等待的结果。

更多关于为什么以及如何在承诺上找到here