我想从函数中获取比return new Promise(...);
更多的逻辑。我不确定将Promise存储到变量中是否正在改变它背后的“同步性”,因为我看到的每个例子都没有这样做。我还希望将一个Promise存储到一个变量中,最后返回,即使我没有涉及条件,因为它对于调试来说似乎很糟糕,并且通常将所有逻辑都驻留在return语句中。 / p>
function doSomething(){
var promise_var1;
if (condition){
//Do something async, like an AJAX call to an API
setTimeout(function(){promise_var1 = Promise.resolve('a')}, 3000);
}else{
//Do something synchronous, like setting a default value
promise_var1 = Promise.resolve('b');
}
return promise_var1;
}
doSomething().then(function(value){console.log('c'+value)});
我现在正在
然而,我尝试了各种各样的方式,所以我可能在概念上误解了一些东西。doSomething()未定义
编辑:“重复”问题是询问如何处理promise中的条件。我问如何通过变量返回promises(实现single exit)。这可能是不可能的,因为JavaScript是弱类型的,Promise变量返回与Promise返回可能表现不同,但如果有一个解决方案,我宁愿单退出多个返回。
答案 0 :(得分:1)
尝试写下这样的承诺。
my $compare_x = $user_input_x;
my $compare_y = $user_input_y;
my $op = <some safe non-user-input, or otherwise checked against a safe list>;
if ( eval("\$compare_x $op \$compare_y") )
{
...
}
答案 1 :(得分:1)
简单地回答你的问题:是的。您可以绝对在变量中存储承诺。这正是我们承诺的原因。它允许我们&#34;存储&#34;一个可能尚不存在的值,因此我们可以轻松地将其传递给程序的其他部分。
最终,您仍然需要调用回调来获取内部值,使用.then
或使用async
/ await
过甜的糖。但是,在您准备好定义回调之前,您可以像其他任何值一样传递未来值。
但是,在您的示例中,我并不认为使用临时变量可以改善代码的逻辑或可读性。 (事实上,它根本不起作用,因为在if
被调用之后,.then
在3秒之后才会向返回的变量添加一个承诺。 )只需确保条件的每个分支都返回一个承诺,然后你就可以了。
function doSomething(condition){
if (condition){
//Do something async, like an AJAX call to an API
return new Promise(resolve => {
setTimeout(() => resolve('a'), 3000);
})
}
//Don't actually need an else because if condition returns.
//Do something synchronous, like setting a default value.
return Promise.resolve('b');
}
doSomething(true)
.then(value => console.log('c ' + value));
doSomething(false)
.then(value => console.log('c ' + value));
&#13;
答案 2 :(得分:0)
为何让它变得复杂?
let doSomething = condition => condition ? somethingAsync() : Promise.resolve('b');
函数总是会返回一个Promise,然后它会在事件循环的一个回合中解析还是3分钟
这是一个带有一个返回的版本和一个Promise内的分支
let doSomething = condition => {
return new Promise(resolve => {
if (condition) {
resolve(someAsyncThing());
} else {
resolve('b');
}
});
};
我仍然认为它比上面的版本更不易阅读和简单,但它是你的代码库,YMMV。