下划线地图行为

时间:2017-10-10 18:06:19

标签: javascript underscore.js

  a = _.map(b, set);
  console.log(a);

  function set(item) {
      var cpt = item.code;

      var options = ["code"];
      RS.getCodes(cpt).then(function(response) {
          options = options.concat(_.map(response, options));
          console.log(ndcOptions);
          return options;
      });
   }

在我的程序中,我想将函数set应用于列表b中的每个元素以生成新列表a。但是,我认为set函数有一些异步执行,当我打印a时,它会给我一个空白列表,所有console.log(ndcOptions);都会在执行console.log(a);后执行。我想知道是否有任何方法可以避免JS中的这种行为,因此a将在执行console.log(a);之前及之后的所有行完全分配。{/ p>

1 个答案:

答案 0 :(得分:2)

  

我想知道在JS中是否有任何方法可以避免这种行为,因此在执行console.log(a)之前将完全分配一个;以及之后的所有行。

由于您要在一组项目上调用异步函数,因此通常的解决方案是为每个项目创建一个承诺,并使用Promise.all等待所有项目。

对现有代码的更改很少。您需要做的就是从set返回承诺。

Promise.all(_.map(b, set)).then(function(a) {
  console.log(a);
  // Anything that needs access to `a` needs to be in or called from here
});

function set(item) {
  var cpt = item.code;

  var options = ["code"];
  return RS.getCodes(cpt).then(function(response) {
//^^^^^^ return the created promise
      options = options.concat(_.map(response, options));
      console.log(ndcOptions);
      return options;
  });
}