【问题标题】:javascript not resolving promisejavascript没有解决承诺
【发布时间】:2019-01-31 04:08:58
【问题描述】:

Javascript 代码,试图立即解决一个承诺:

           var promiseData;

            var promise = <<<promise maker>>>.then(function (myContent) {
                console.log("success");
            }, function () {
               console.log("fail!");   
            });

            Promise.resolve(promise)

            console.log("about to return");

            return promiseData;

哪个输出到控制台:

about to return
success

我有一个要求让promise立即返回(promise是在一个回调方法中创建的,并且该方法需要立即返回一个值,稍后返回数据意味着我们不再处于正确的上下文中并且该值(尚未返回)已被使用(未定义)。

关于我可能做错了什么的任何建议?

更新: &lt;&lt;&lt;promise maker&gt;&gt;&gt; 是对返回承诺的依赖项的调用;

【问题讨论】:

  • 什么是“承诺者”?你希望Promise.resolve(promise) 做什么?
  • 你应该等待承诺,这样任何依赖于结果的代码在完成之前都不会运行。
  • 你不能像调用者期望的那样立即从异步操作中返回一个值:stackoverflow.com/questions/14220321/…
  • @Nnoel 那么你要么需要找到一种方法来避免“承诺制造者”,要么你需要改变你的框架(或者弄清楚如何在框架中做异步的东西)
  • promise 的主要用例是当一个值不会立即可用时。

标签: javascript promise


【解决方案1】:

您似乎希望Promise.resolve(promise) 立即停止,等到承诺解决,然后继续。这将接近同步执行。

然而,Promise.resolve(value) 返回一个 Promise,它立即用 value 解析,它不解析现有的 Promise。

您正在寻找的是await(或只是Promise.then):

var promise = <<<promise maker>>>.then(function (myContent) {
    console.log("success");
}, function () {
    console.log("fail!");   
});

promise.then(function() {
  console.log("about to return");
});

您可能会注意到我在 sn-p 中遗漏了promiseData。那是因为为了在正确的时刻返回数据,你也必须在那里异步。所以你必须实际返回一个可以用promiseData 解决的 Promise,它归结为:

<<<promise maker>>>
  .then(function(promiseData) {
    console.log('success');
    return promiseData;
  })
  .then(function(promiseData) {
    console.log('about to return');
    return promiseData;
  })
  .catch(function(err) { console.log('fail!'); })

【讨论】:

  • 我也建议使用异步/回调,但 OP 说这不是一个选项 - 他们需要 立即 的值。
  • @dominik...我对您的回答感到很兴奋...但我不确定每个“then”中的“return”在哪里,然后我看到 Tyler 的评论并且完全困惑现在:-(
  • @Tyler,我的意思是它需要等待承诺解决,然后再继续执行其余代码。
【解决方案2】:

如果我没记错的话,这个函数流程很接近你的需要,但它也返回了一个解析为 promiseData 的承诺:

async function getPromiseData() {
  try {
    const promiseData = await <<<promise maker>>>;
    console.log("success");
    console.log("about to return");
    return promiseData;
  } catch (err) {
    console.log("fail!");
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多