【发布时间】:2017-12-30 09:47:41
【问题描述】:
我在异步函数中的 await 语句是对 jQuery 的 $.post() 方法的调用,它返回一个有效的承诺,但是我在 TypeScript 中遇到了这个错误:
“await”操作数的类型必须是有效的承诺,或者不能包含可调用的“then”成员。
我的功能是这个(为示例简化)。代码有效且有效,但在 TS 控制台中出现错误。
async function doAsyncPost() {
const postUrl = 'some/url/';
const postData = {name: 'foo', value: 'bar'};
let postResult;
let upateResult;
function failed(message: string, body?: string) {
console.log('error: ', message, ' body: ', body);
}
function promiseFunc() {
return new Promise<void>( resolve => {
// ... do something else....
resolve();
});
};
function finish() {
// ... do something at the end...
}
try {
// The error is on the $.post()
postResult = await $.post(postUrl, $.param(postData));
if (postResult.success !== 'true') {
return failed('Error as occoured', 'Description.....');
}
await promiseFunc();
return finish();
} catch (e) {
await failed('Error as occoured', 'Description.....');
}
}
我猜 TS 的 $.post() 有问题,因为你可以在上面调用 .then(),但是我该如何解决这个问题呢?另外,我在更新 2.4.2 之前没有这个错误。
【问题讨论】:
-
似乎 typescript 确实对 jQuery 返回一个 promise 对象感到讨厌,该对象也是一个 jqXHR 对象。尝试
postResult = await Promise.resolve($.post(postUrl, $.param(postData)));或者:postResult = await $.post(postUrl, $.param(postData)).then();尽管后者可能会触发相同的错误。 -
@trincot 您的两个解决方案都有效。似乎有点肮脏和不必要,但我猜是迄今为止最好的选择。如果您想提供您的评论作为答案,我会将其标记为已接受。
标签: jquery typescript es6-promise