【问题标题】:.then() is returning a promise instead of resolved data value [duplicate].then() 返回一个承诺而不是解析的数据值[重复]
【发布时间】:2018-05-30 04:53:00
【问题描述】:

我正在处理的以下 ajax 调用与承诺

function hit_db()
{
    return new Promise(function (resolve, reject)
    {
        $.ajax({
            url: target_url,
            type: "GET",
            async: true,
            crossDomain: true,
            success: function (data) { //<--Ultimately I want this snippet to return this data variable
                resolve(data);
            },
            error: function (err) {
                reject(error);
            }
        });
    });
}
return hit_db().then(data => {. // <--EDIT
   return data;
});

每当我尝试返回数据时,我都会得到obj Promise,而不是应该说Great! Success!的服务器响应

我认为一旦承诺兑现,我就可以返回服务器响应的数据。

我在这里讨论如何从我得到的异步响应中解开 Promise 对象

然后使用 async/await 语法 Stills 返回一个 obj Promise

function hit_db()
{
    return new Promise(function (resolve, reject)
    {
        $.ajax({
            url: target_url,
            type: "GET",
            async: true,
            crossDomain: true,
            success: function (data) {
                resolve(data);
            },
            error: function (err) {
                reject(error);
            }
        });
    });
}
async function handler() {
    try {
        var data = await hit_db();
        return data;
    }
    catch (error) {
        throw new Error('Network call failed');
    }
}
return handler();

旁注:我已经通过我的 ajax 调用解决了任何可能的 CORS 问题

【问题讨论】:

  • 尝试在success处理程序中返回解析:return resolve(data);
  • 这是每个the documentation 所期望的。也许你想要 .done(),它返回 deferred 对象?
  • “我认为一旦承诺兑现,我可以返回作为服务器响应的数据” 不,这不是承诺的工作方式。您只能在 .then 回调中获取已解析的值。 hit_db 的调用者必须知道该函数返回一个承诺。 hit_db().then(data =&gt; /* do something with data */)。 Promise不会让你的异步代码同步。它们只是提供了一个统一的 API 来处理异步值。
  • @J.Pichardo 我明白,但这也是延迟承诺反模式,因为在 jQuery v3+ $.ajax 返回一个 Promises A+ 兼容承诺
  • @kevin 为什么?!?!?!

标签: javascript jquery ajax promise


【解决方案1】:

您正在返回hit_db().then(...).then(...) 的返回值是一个承诺。您想要达到的“取消嵌套”级别是不可能的。

正如 Gustavo 所说,这需要 async/await。

有了 Promise,您可以进行链接以简化异步工作流程

hit_db()
  .then(...)
  .then(...)
  .then(...)
  .catch(...)

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 2018-03-10
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2021-01-13
    • 2019-12-02
    相关资源
    最近更新 更多