我有一个接受单个参数的函数。我需要能够判断这个参数是 jQueryPromise
还是Deferred
对象。如果不是,那么该值可能是任何类型并具有任何属性,因此仅仅因为 promise 方法的存在是不安全的。
这是我希望我的函数如何表现的示例:
function displayMessage(message) {
if (message is a Promise or Deferred) {
message.then(displayMessage);
} else {
alert(message);
}
}
注意promise 的递归处理:如果一个promise 被另一个promise 值解决,我们不显示它,我们等待它被解决。如果它返回另一个承诺,请重复。
这很重要,因为如果不是这种情况,我就可以使用jQuery.when
:
function displayMessage(message) {
jQuery.when(message).then(function(messageString) {
alert(messageString);
});
}
这将正确处理价值观和价值观的承诺......
displayMessage("hello"); // alerts "hello"
displayMessage(jQuery.Deferred().resolve("hello")); // alerts "hello"
...但是一旦我们得到价值承诺的承诺,它就会崩溃:
displayMessage(jQuery.Deferred().resolve(
jQuery.Deferred().resolve("hello")
)); // alerts "[object Object]"
jQuery.when
能够判断一个值是否是承诺,所以显然这是可能的。我该如何检查?