javascript - 如何在 Promise 完成后调用 axios 中的数组元素

标签 javascript asynchronous d3.js svg axios

我试图通过使用对 api 的 axios 调用填充数组来获取 font Awesome 图标在 d3 中绘制。我对 axios 的异步性质有疑问。当我记录数组时,我会显示所有要显示的元素,尽管当我调用单个元素时,它会返回未定义。

我想我看到了在整个数组上调用 console.log 的原因,因为 console.log() 也是异步的,所以当我调用整个数组时,它会等到所有元素完成加载。然后,当我调用单个元素时,它会立即调用。这就是为什么我相信当我调用整个数组时我可以看到元素。

我遇到的主要问题是,当我调用 axios.all 的 .then 函数中的元素时,要定义我的天气图标数组元素。

这就是我目前所拥有的......

axios.all(promises)
     .then(axios.spread((...args) => {
     for (let i = 0; i < args.length; i++) {
          weathericons[i] = args[i].data.fa;
     }
}))
// After everything is loaded from the server can we append our data
      .then(
          svg.append('svg:foreignObject') //d3 chart
          .data(options.labels)
          .attr('alt', "")
          .attr("height", xScale.bandwidth() > 100 ? 100 : xScale.bandwidth())
          .attr("width", xScale.bandwidth() > 100 ? 100 : xScale.bandwidth())
          .attr("transform", function(d, j) {
                    var height_adj = 60 * (xScale.bandwidth() > 1 ? 1 : xScale.bandwidth()) / 50;
                    return "translate(" + (xScale(options.labels[j]) + (xScale.bandwidth() / 2) - ((xScale.bandwidth() > 100 ? 100 : xScale.bandwidth()) / 2))
                        + "," + (yScale(0) - height_adj) + ") scale(" + (xScale.bandwidth() > 100 ? 100 : xScale.bandwidth()) / 50  + ")"
                })
           .append('i')
           .attr('class', function(d, j){
               return 'fa fa-' + weathericons[j] + '-o"'; //This is what i need to work
           })
       )

我试图让天气图标数组元素调用所有数据,以便我得到每个数据点的图标。我似乎想不出一个好的解决办法。

有没有办法在调用 .then 语句之前让数组完全填充?

最佳答案

你肯定犯了一个明显的错误,以svg.append()开头的整个表达式是第二个then()的第一个参数,但是的参数>then() 应该是一个函数。

像这样改变

axios.all(promises)
.then(axios.spread((...args) => {
    for (let i = 0; i < args.length; i++) {
         weathericons[i] = args[i].data.fa;
    }
}))
.then(() => {
    svg.append('svg:foreignObject')
    ...

})

但是由于您没有从第一个 then() 返回 promise (或任何与此相关的内容),因此第二个是不必要的。你可以直接写

axios.all(promises)
.then(axios.spread((...args) => {
    for (let i = 0; i < args.length; i++) {
         weathericons[i] = args[i].data.fa;
    }

    svg.append ...
}))

关于javascript - 如何在 Promise 完成后调用 axios 中的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57630194/

相关文章:

javascript - 为什么我必须在 mongoose 中使用 `toObject()` 来确定对象是否具有属性?

javascript - 如何在 Chrome 扩展程序中操作新窗口?

javascript - d3 图标从节点上飘离

javascript - 如何更改世界地图json文件的中央子午线?

javascript - 如何检查 jQuery 加载的 PHP 文件是否发生变化并在发生变化时执行函数?

javascript - neo4j - 查找与匹配 x 长度属性值列表的 Node 有关系的所有 Node

c# - 如何在计时器内调用异步任务?

java - Android LRU 缓存未显示正确的位图?

Javascript 对象和异步调用

javascript - 文本屏蔽圆圈点击方法d3js