查找函数是否 return promise 的方法
Way to find if function will return promise
下面我有一个函数 return 是一个解析 true
的承诺。有什么方法可以确定一个函数是否 return 一个承诺?
var myPromiseFunction = function(){
return Promise.resolve(true)
}
myPromiseFunction().then(function(value){
console.log(value) // => true
})
function mySyncFunction(){
return "hello"
}
willReturnPromise(myPromiseFunction) // => true
willReturnPromise(mySyncFunction) // => false
Is there any way I can find out if a function will return a promise?
否(并非没有实际调用它)。您最好的办法是依靠命名和 API 约定的一致性。
为了快速 "proof" 无法测试 return 类型,请考虑以下函数:
function maybeAPromise() {
if (Math.random() < .5) {
return Promise.resolve('foo');
} else {
return 'bar';
}
}
虽然我个人认为像 JavaScript 这样的动态语言的生产力优势值得他们做出权衡,但不可否认的是,缺乏编译时类型安全是 [=24= 中的权衡之一] 类别。
话虽这么说,如果您只想强制结果为 Promise
,Promise.resolve()
会很方便。例如,
Promise.resolve(maybeAPromise()).then(...);
没有好的方法可以做到这一点,但您可以调用这些方法并检查它们的 return 值。
function willReturnPromise(fn) {
const result = fn();
return result && typeof result.then === 'function';
}
A+ Promise 规范不要求 promises 具有除名为 then
的函数以外的任何其他内容,因此如果您希望该函数与所有 Promise 实现一起使用,这是您可以做的最好的事情。
调用函数并丢弃结果只是为了确定这不是一个好主意。
调用后检查 return 值。毕竟这是JavaScript,而不是某种静态类型的语言。您有所有相同的选项:
function foo(func) {
var result = func();
if (result instanceof Promise) {
result.then(bar).catch(failure);
} else {
bar(result);
}
}
foo(myPromiseFunction);
foo(mySyncFunction);
但我建议不要进行此类优化,因为它会增加复杂性。最好让 Promise.resolve()
做它的事情并将同步代码流折叠到异步代码流中。 .then
会自动为您 return 执行任何操作,因此我发现这种方法非常易读。
下面我有一个函数 return 是一个解析 true
的承诺。有什么方法可以确定一个函数是否 return 一个承诺?
var myPromiseFunction = function(){
return Promise.resolve(true)
}
myPromiseFunction().then(function(value){
console.log(value) // => true
})
function mySyncFunction(){
return "hello"
}
willReturnPromise(myPromiseFunction) // => true
willReturnPromise(mySyncFunction) // => false
Is there any way I can find out if a function will return a promise?
否(并非没有实际调用它)。您最好的办法是依靠命名和 API 约定的一致性。
为了快速 "proof" 无法测试 return 类型,请考虑以下函数:
function maybeAPromise() {
if (Math.random() < .5) {
return Promise.resolve('foo');
} else {
return 'bar';
}
}
虽然我个人认为像 JavaScript 这样的动态语言的生产力优势值得他们做出权衡,但不可否认的是,缺乏编译时类型安全是 [=24= 中的权衡之一] 类别。
话虽这么说,如果您只想强制结果为 Promise
,Promise.resolve()
会很方便。例如,
Promise.resolve(maybeAPromise()).then(...);
没有好的方法可以做到这一点,但您可以调用这些方法并检查它们的 return 值。
function willReturnPromise(fn) {
const result = fn();
return result && typeof result.then === 'function';
}
A+ Promise 规范不要求 promises 具有除名为 then
的函数以外的任何其他内容,因此如果您希望该函数与所有 Promise 实现一起使用,这是您可以做的最好的事情。
调用函数并丢弃结果只是为了确定这不是一个好主意。
调用后检查 return 值。毕竟这是JavaScript,而不是某种静态类型的语言。您有所有相同的选项:
function foo(func) {
var result = func();
if (result instanceof Promise) {
result.then(bar).catch(failure);
} else {
bar(result);
}
}
foo(myPromiseFunction);
foo(mySyncFunction);
但我建议不要进行此类优化,因为它会增加复杂性。最好让 Promise.resolve()
做它的事情并将同步代码流折叠到异步代码流中。 .then
会自动为您 return 执行任何操作,因此我发现这种方法非常易读。