我在转换一个jQuery插件使用promises
而不是callbacks
的中间。这应该是非常基本的,但不确定问题是我链接承诺的方法,我的返回类型,还是TypeScript过于繁琐。
我一直得到这个错误:
Error 27 Supplied parameters do not match any signature of call target:
Type '(value: {}) => {}' requires a call signature, but type 'JQueryPromise<any>' lacks one.
我的函数的简化版本如下:
_navigate(forward: boolean, $panel: JQuery, target: string): JQueryPromise<any>
{
var dfd = $.Deferred();
switch (target)
{
// '_self' is a full page load link
case '_self':
setTimeout(function ()
{
window.location.href = url;
}, 0);
// Return empty promise - as we are about to lose the page
dfd.resolve(true);
break;
// _back re-displays a panel already loaded
case '_back':
// Fetch a reference to the panel before this one
var $existingPanel = THIS._getNextPanel($panel, false);
// >>>> ERROR ON NEXT LINE <<<<<<
// This will animate back in the previous panel - promise on complete
dfd = dfd.then(THIS._gotoPanel($existingPanel, false, true, target));
break;
// [SNIP]
}
return dfd.promise();
}
_gotoppanel只是另一个方法,也返回JQueryPromise<any>
承诺:
_gotoPanel($panel: JQuery, forward: boolean, transition: boolean, target?: string): JQueryPromise<any>
最终版本需要能够链接任何数量的方法和$.ajax
调用的承诺,但我一直打这个错误。如果不是JQueryPromise<any>
,我的返回类型应该是什么?
如果不是
JQueryPromise<any>
,返回类型应该是什么?
正如错误消息'(value: {}) => {}' requires a call signature
所说,您需要将回调传递给.then()
,而不是承诺!
我想你只是想
dfd = THIS._gotoPanel($existingPanel, false, true, target);
作为dfd
,否则在_back
情况下根本无法解析
未测试,但我猜您需要向then
提供类型信息,例如then<any>
如果你不这样做,jQuery将在then
JQueryPromise
。无论如何,我个人不会将方法包装在$.Deferred()
中,而是宁愿返回$.when(true)
而不是dfd.resolve(true)
,并直接返回THIS._gotoPanel(...)
编辑
var d = $.Deferred(); d = d.then(blah); return d.promise()
不飞
如果在Deferred
中换行,沿着以下行:
_navigate(forward: boolean, $panel: JQuery, target: string): JQueryPromise<any>
{
return $.Deferred(dfd => {
switch (target) {
// '_self' is a full page load link
case '_self':
....
dfd.resolve(true);
break;
case '_back':
THIS._gotoPanel($existingPanel, false, true, target)).then(
() => { dfd.resolve(whatever); },
err => { dfd.reject(err); }
)
break;
}
}).promise();
}