【问题标题】:Unable to resolve a Promise calling another method无法解决调用另一个方法的 Promise
【发布时间】:2021-07-24 06:32:07
【问题描述】:

我无法解决已创建的 Promise。不知道问题出在哪里,请帮我解决这个问题。

const tsearch = async () => {
    console.log("calling")
    //requesting the relevant page data
    await new Promise((resolve) =>  {
        getData("wifi", 2, true); 
        return resolve("success")
    });
    console.log(finished);
}

function getData(url, callControl = 0, wifi = false) {
    if (!!url) {
        console.log(url + " - " + callControl)
    }
    if (callControl > 0)
    setTimeout(getData, 1000, url, --callControl)
    else {
        console.log("getData - else part - resolving")
        // Promise.resolve();
    }
}


tsearch();

【问题讨论】:

  • 您正在立即解决 - getData 中的超时不会阻止您调用解决
  • 您必须将 resolve 传递给 getData 以便 getData 在完成时调用它。
  • 将 getData 调用修改为 getData("wifi", 2, true, resolve); 并在 getData() 方法中添加了 Promise.resolve(resolve); 似乎仍然不起作用,我是否遗漏了什么。

标签: javascript promise resolve


【解决方案1】:

asyncawait 旨在使您的程序更易于编写。令人震惊的是,有多少人使用它来使他们的程序更加复杂。您的问题中存在许多误解,本文的其他答案中还存在许多其他误解 -

async function tsearch () {
  console.log("calling")
  const result = await getData("wifi", 2, true)
  console.log("finished tsearch")
  return result
}

async function getData (url, callControl, wifi = false) {
  while (callControl > 0) {
    console.log(`${url} - ${callControl}`)
    callControl--
    await sleep(1000)
  }
  return "done"
}

function sleep (ms) {
  return new Promise(r => setTimeout(r, ms))
}

tsearch().then(console.log, console.error)
calling
wifi - 2
wifi - 1
finished tsearch
done

如果您想递归地编写getData,这仍然是一种选择,就像任何async 函数一样。第二个示例具有完全相同的行为并产生相同的输出 -

async function tsearch () {
  console.log("calling")
  const result = await getData("wifi", 2, true)
  console.log("finished tsearch")
  return result
}

async function getData (url, callControl, wifi = false) {
  if (callControl <= 0) return "done"
  console.log(`${url} - ${callControl}`)
  await sleep(1000)
  return getData(url, callControl - 1, wifi)
}

function sleep (ms) {
  return new Promise(r => setTimeout(r, ms))
}

tsearch().then(console.log, console.error)

有关滥用asyncawait 的更多信息,请参阅这些相关问答-

【讨论】:

  • 您的输入大大简化了代码,感谢您的输入!
【解决方案2】:

我不得不重构代码

  1. 删除不必要的 setTimeout
  2. 并添加承诺链。

(() => {
function getData(url, callControl, boo, response) {
    if (response ) console.log(response)
    return new Promise(function(resolve, reject) {
        console.log("calling")
        let res = `: url: "${(url)}", callControl: "${(callControl)}" + boo: "${(boo)}"`
        if (!url || callControl <= 0) res = `NOT resolved + ${res}`
        else res = `RESOLVED + ${res}`
        resolve(res)
    });
}


let tsearch = new getData("wifi", 0, true)

tsearch
.then(result => {return new getData("wifi", 2, true, result)})
.then(result => {return new getData(null, 2, true, result)})
.then(result => console.log(result))
.catch(reason => console.log(reason))
.finally(() => console.log("Done"))
})();

【讨论】:

  • 为什么代码重复,为什么两次超时?我不明白您的重构如何与 OP 的代码做同样的事情。
  • Bergi 精确,在某种程度上它是教学法;但是没关系,我会尽快减少它?
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 2020-09-17
  • 2017-10-28
  • 2013-01-07
  • 2012-04-30
相关资源
最近更新 更多