【问题标题】:How to return a value from a promise which isn't a pending promise: d3.js, Javascript? [duplicate]如何从不是未决承诺的承诺中返回一个值:d3.js,Javascript? [复制]
【发布时间】:2021-12-24 07:38:41
【问题描述】:

我对异步 javascript 编程比较陌生。在使用 d3 库中的 d3.scv 函数时,我遇到了一个问题,即在异步函数范围内等待来自 d3.csv 的承诺结果时,我可以直接访问已解析的值,但是当我返回此已解析的值时我得到一个未决的承诺。

代码

async function generateCountryData(){
        let csvData = await d3.csv("./data/data.csv", (d) => {
                return {
                        "id" : +d["id"], // The '+' turns a string into a number
                        "country" : d["name"],
                        "faction" : +d["overlord"]
                }
        });

        let dataArray = csvData.map(Object.values);

        // LOG 1
        console.log(dataArray);
        return dataArray;
}
// LOG 1: Array(58)
// Returns: Promise {<pending>} "fulfilled"[[PromiseResult]]: Array(58)

async function func1() {
    let result = await generateCountryData();

    // LOG 2
    console.log(result);
    return result;
}
// LOG 2: Array(58)
// Returns: Promise {<pending>} "fulfilled"[[PromiseResult]]: Array(58)

由于我不想在每次要访问此数组时都定义一个新的异步函数,所以我想知道如何返回一个已定义的已解析值,该值不是待处理的承诺。

【问题讨论】:

  • asyncawaitd3.csv 的整个组合正在伤害我的大脑!说真的,d3.csv已经是一个承诺......您的整个代码可能只是 d3.csv(url).then(),您将依赖于检索到的 CSV 的代码放入 then
  • "我不想每次访问这个数组时都定义一个新的异步函数" - 看看this answer

标签: javascript asynchronous d3.js async-await


【解决方案1】:

这很烦人,但这它的工作原理。任何需要访问异步操作结果的东西本身都必须是异步的。

因此,虽然有不同的模式来处理这个问题(回调、观察者、承诺),但你无法绕过它,所以最好接受它。

您不能将异步代码转换为非异步代码。一篇关于此的有趣文章:

https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 2015-12-16
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多