【发布时间】: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 => /* do something with data */)。 Promise不会让你的异步代码同步。它们只是提供了一个统一的 API 来处理异步值。 -
@J.Pichardo 我明白,但这也是延迟承诺反模式,因为在 jQuery v3+ $.ajax 返回一个 Promises A+ 兼容承诺
-
@kevin 为什么?!?!?!
标签: javascript jquery ajax promise