gpt4 book ai didi

javascript - 来自较早 promise 的控制台日志出现在来自最新 promise 的控制台日志之后

转载 作者:行者123 更新时间:2023-12-01 15:39:47 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What is the explicit promise construction antipattern and how do I avoid it?

(3 个回答)


2年前关闭。




下面不是我的确切代码,但我只是想概述一下结构。当我运行代码时,我得到控制台日志的顺序是这样的:

  • '完成'
  • json

  • 我希望这会反过来,因为为了让 function2 完成(并发送“完成”解析值), function3 必须首先完成。
    我想了解为什么它不能那样工作。
    function1().then(() => {
    return function2()
    ).then((message) => {
    console.log(message)
    })

    function function2() {
    return new Promise((resolve, reject) => {
    fetch(url, {
    method: 'get',
    body: null,
    headers: {
    "Content-Type": "application/json; charset=UTF-8",
    "Accept": "application/json; charset=UTF-8",

    },
    })
    .then(res => res.json())
    .then((json) => {
    return function3(json)
    })

    resolve('Done')
    })
    }

    function function3(json) {
    console.log(json)
    }

    最佳答案

    您调用resolve在您的 fetch 之前甚至完成。
    如果你把它移到另一个 then 就行了:

    // ...
    .then(res => res.json())
    .then((json) => {
    return function3(json)
    })
    .then(() => {
    resolve('Done')
    })
    但其实整个 new Promise甚至没有必要因为 fetch已经返回了一个 promise !
    // ...

    function function2() {
    return fetch(url, { // It's important to actually *return* the promise here!
    method: 'get',
    body: null,
    headers: {
    "Content-Type": "application/json; charset=UTF-8",
    "Accept": "application/json; charset=UTF-8"
    }
    })
    .then(res => res.json())
    .then((json) => {
    return function3(json)
    })
    .then(() => {
    return 'Done'
    })
    }
    这可以使用 async 进一步简化。/ await :
    // I moved this into a function because the global module-level code
    // is not in an async context and hence can't use `await`.
    async function main () {
    await function1()
    console.log(await function2())
    }

    async function function1 () {
    // I don't know what this does, you didn't include it in your code snippet
    }

    async function function2 () {
    const response = await fetch(url, {
    method: 'get',
    body: null,
    headers: {
    "Accept": "application/json; charset=UTF-8"
    }
    })

    const json = await response.json()
    await function3(json)

    return 'Done'
    }

    // At the moment this wouldn't have to be async because you don't do anything
    // asynchronous inside, but you had `return function3(json)` in the original code,
    // so I assume it is *going* to be async later.
    async function function3 (json) {
    console.log(json)
    }

    // Don't forget to .catch any rejections here! Unhandled rejections are a pain!
    main().catch(console.error)
    (当我这样做时,我删除了 Content-Type header ,因为它对 GET 请求毫无意义。)

    关于javascript - 来自较早 promise 的控制台日志出现在来自最新 promise 的控制台日志之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63092483/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com